import base64
from datetime import datetime
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, Http404
from django import forms
from saip.usuario.models import Usuario
from saip.usuario.models import Rol
from saip.usuario.models import Permiso
from saip.usuario.models import UsRolPro
from saip.usuario.forms import SearchForm
from saip.proyecto.models import Proyecto
from saip.proyecto.models import Artefacto
from saip.proyecto.models import TipoArtefacto
from saip.proyecto.models import Relacion
from saip.proyecto.models import LineaBase
from saip.proyecto.models import *
from saip.proyecto.forms import *
from saip.proyecto.forms import ArtefactoImEditForm
from saip.proyecto.forms import ArtefactoDiEditForm
from saip.proyecto.forms import ArtefactoAnEditForm
from saip.proyecto.forms import ArtefactoImForm
from saip.proyecto.forms import ArtefactoAnForm
from saip.proyecto.forms import ArtefactoDiForm
from saip.proyecto.forms import ProyectoForm
from saip.proyecto.forms import ProyectoEditForm
from saip.proyecto.forms import TipoArtForm
from saip.proyecto.forms import TipoArtEditForm
from saip.proyecto.forms import RolAsOpForm
from saip.settings import MEDIA_ROOT

@login_required	
def desarrolo_page(request):
    """
    Habilita las vistas y los botones correspondientes, de acuerdo a los permisos que posee
    un usuario sobre el proyecto.
    """
    desarrollotag = False
    artanaltag = False
    tipoarttag = False
    artdistag = False
    artimptag = False
    ltipoart = False
    ctipoart = False
    mtipoart = False
    etipoart = False
    lartanal = False
    cartanal = False
    martanal = False
    eartanal = False
    lartdis = False
    cartdis = False
    martdis = False
    eartdis = False
    lartimpl = False
    cartimpl = False
    martimpl = False
    eartimpl = False
    asigadm = False
    asigproy = False
    genlinbasea = False
    genlinbased = False
    genlinbasei = False
    aprobaran = False
    aprobardi = False
    aprobarim = False
    proyectos = Proyecto.objects.all()
    if 'proyectoname' in request.GET:
        user = Usuario.objects.get(username=request.user.username)
        proyectoname = request.GET['proyectoname']
        project = Proyecto.objects.get(nombre=proyectoname)
        us_rol_pro = UsRolPro.objects.filter(usuario=user).filter(proyecto=project)
        for us_rol in us_rol_pro:
            perms=us_rol.rol.rol_permiso.all()
            for perm in perms:
                if perm.id == 14:
                    ltipoart = True
                    tipoarttag = True
                    desarrollotag = True
                if perm.id == 15:
                    ctipoart=True
                    tipoarttag = True
                    desarrollotag = True
                if perm.id == 16:
                    mtipoart = True
                    tipoarttag = True
                    desarrollotag = True
                if perm.id == 17:
                    etipoart=True
                    tipoarttag = True
                    desarrollotag = True
                if perm.id == 18:
                    lartanal = True
                    artanaltag = True
                    desarrollotag = True
                elif perm.id == 19:
                    cartanal = True
                    artanaltag = True
                    desarrollotag = True
                elif perm.id == 20:
                    lartanal = True
                    martanal = True
                    artanaltag = True
                    desarrollotag = True
                elif perm.id == 21:
                    lartanal = True
                    eartanal = True
                    artanaltag = True
                    desarrollotag = True
                elif perm.id==22:
                    lartdis = True
                    artdistag = True
                    desarrollotag = True
                elif perm.id == 23:
                    cartdis = True
                    artdistag = True
                    desarrollotag = True
                elif perm.id == 24:
                    martdis = True
                    lartdis = True
                    artdistag = True
                    desarrollotag = True
                elif perm.id == 25:
                    eartdis = True
                    lartdis = True
                    artdistag = True
                    desarrollotag = True
                elif perm.id == 26:
                    lartimpl = True
                    artimptag = True
                    desarrollotag = True
                elif perm.id == 27:
                    cartimpl = True
                    artimptag = True
                    desarrollotag = True
                elif perm.id == 28:
                    martimpl = True
                    lartimpl = True
                    artimptag = True
                    desarrollotag = True
                elif perm.id == 29:
                    eartimpl = True
                    lartimpl = True
                    artimptag = True
                    desarrollotag = True
                elif perm.id == 30:
                    asigproy = True
                    desarrollotag = True
                elif perm.id == 32:
                    lartanal = True
                    artanaltag = True
                    genlinbasea = True
                    desarrollotag = True
                elif perm.id == 33:
                    lartdis = True
                    artdistag = True
                    genlinbased = True
                    desarrollotag = True
                elif perm.id == 34:
                    lartimpl = True
                    artimptag = True
                    genlinbasei = True
                    desarrollotag = True
                elif perm.id == 35:
                    lartanal = True
                    aprobaran = True
                    artanaltag = True
                    desarrollotag = True
                elif perm.id == 36:
                    lartdis = True
                    aprobardi = True
                    artdistag = True
                    desarrollotag = True
                elif perm.id==37:
                    lartimpl = True
                    aprobarim = True
                    artimptag = True
                    desarrollotag = True
        variables = RequestContext(request, {
            'tipoadr':'dev_page',
            'project':project,
            'showproylist':False,
            'tipoarttag':tipoarttag,
            'ltipoart':ltipoart,
            'ctipoart':ctipoart,
            'mtipoart':mtipoart,
            'etipoart':etipoart,
            'proyectos':proyectos,
            'desarrollotag':desarrollotag,
            'artanaltag':artanaltag,
            'artdistag':artdistag,
            'artimptag':artimptag,
            'lartanal':lartanal,
            'cartanal':cartanal,
            'martanal':martanal,
            'eartanal':eartanal,
            'lartdis':lartdis,
            'cartdis':cartdis,
            'martdis':martdis,
            'eartdis':eartdis,
            'lartimpl':lartimpl,
            'cartimpl':cartimpl,
            'martimpl':martimpl,
            'eartimpl':eartimpl,
            'asigproy':asigproy,
            'genlinbasea':genlinbasea,
            'genlinbased':genlinbased,
            'genlinbasei':genlinbasei,
            'aprobaran':aprobaran,
            'aprobardi':aprobardi,
            'aprobarim':aprobarim
        })
        return render_to_response('dev_page.html', variables)
    else:
        try:
            user = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            roles = user.usuario_rol.all()#todos los roles que tiene ese usuario
            
            us_rol_pro = UsRolPro.objects.filter(usuario=user)
            for usrol in us_rol_pro:
                if usrol.proyecto:
                    proyectotag = True
                    proyectos.filter(id=usrol.proyecto.id)
                    proyectos=proyectos|Proyecto.objects.filter(id=usrol.proyecto.id)
                    #if not usrol.proyecto in proyectos:
                    #    proyectos=Proyecto.objects.filter(id=usrol.proyecto.id)
                        #proyectos.append(usrol.proyecto)
            
            for rol in roles:
                perms = rol.rol_permiso.all()
                for perm in perms:
                    if perm.id == 17:
                        desarrollotag = True
                    elif perm.id == 18:
                        desarrollotag = True
                    elif perm.id == 19:
                        desarrollotag = True
                    elif perm.id == 20:
                        desarrollotag = True
                    elif perm.id == 21:
                        desarrollotag = True
                    elif perm.id == 22:
                        desarrollotag = True
                    elif perm.id == 23:
                        desarrollotag = True
                    elif perm.id == 24:
                        desarrollotag = True
                    elif perm.id == 25:
                        desarrollotag = True
                    elif perm.id == 26:
                        desarrollotag = True
                    elif perm.id == 27:
                        desarrollotag = True
                    elif perm.id == 28:
                        desarrollotag = True
                    elif perm.id == 29:
                        asigadm = True
                    elif perm.id == 30:
                        desarrollotag = True
                    elif perm.id == 31:
                        desarrollotag = True
                    elif perm.id == 32:
                        desarrollotag = True
                    elif perm.id == 33:
                        desarrollotag = True
                    elif perm.id == 34:
                        desarrollotag=True
                    elif perm.id == 35:
                        desarrollotag = True
                    elif perm.id == 36:
                        desarrollotag = True
                
        except:
            return render_to_response(
                'main_page.html', RequestContext(request)
            )
        if 'buscar' in request.GET:
            searchform = SearchForm(request.GET)
            buscar = request.GET['buscar'].strip()
            proyectos = proyectos.filter(nombre__icontains=buscar)
        else:
            searchform = SearchForm() 
        variables = RequestContext(request, {
            'tipoadr':'dev_page',
            'showproylist':True,
            'proyectos':proyectos.distinct(),
            'searchform': searchform,
            'desarrollotag':desarrollotag,
        })
        return render_to_response('dev_page.html', variables)


@login_required	
def crear_proyecto(request):
    """
    Vista que despliega los campos para introducir los datos del nuevo proyecto.
    Los datos obligatorios son nombre, descripcion, lider. 
    """
    if request.method == 'POST':
        form = ProyectoForm(request.POST)
        if form.is_valid():
                Proyecto.objects.create(nombre=form.cleaned_data['nombre'],
                                descripcion=form.cleaned_data['descripcion'],
                                lider=form.cleaned_data['lider'], estado='I',
                                fase_actual='A', fechaCreacion=datetime.now()
                )
                proy = Proyecto.objects.get(nombre=form.cleaned_data['nombre'],
                                lider=form.cleaned_data['lider'], estado='I',
                                fase_actual='A'
                )
                project=Proyecto.objects.get(nombre=form.cleaned_data['nombre'])
                userlider = form.cleaned_data['lider']
                UsRolPro.objects.create(usuario=userlider, rol=Rol.objects.get(id=2), proyecto=project)
                for tipo in TipoArtefacto.objects.filter(proyec_tipoar=None).filter(is_active=True):
                    tipoArt = TipoArtefacto.objects.create(nombre=tipo.nombre,
                        #icono=tipo.icono,
                        codigo=tipo.codigo,
                        proyec_tipoar=proy,
                        fase=tipo.fase,
                        is_active=True)
                #Proyecto.lider.add(form.cleaned_data['lider'])
                return HttpResponseRedirect('/proyecto_read/')
    else:
        form = ProyectoForm()
    variables = RequestContext(request, {
        'form': form
    })
    return render_to_response('proyecto/proyecto_save.html', variables)

@login_required	
def editar_proyecto(request):
    """
    Vista que despliega los campos para modificar los datos de un proyecto existente en el sistema. 
    """
    show_proyecto_list = False
    idProyecto = 0
    if request.method == 'POST':
        # formulario enviado
        proyecto_edit_form = ProyectoEditForm(request.POST)
        idProyecto=request.POST['idProyecto']
		
        if proyecto_edit_form.is_valid():
            proyecto = Proyecto.objects.get(id=idProyecto)
            proyecto.nombre = proyecto_edit_form.cleaned_data['nombre']
            proyecto.descripcion = proyecto_edit_form.cleaned_data['descripcion']
            #proyecto.lider=proyecto_edit_form.cleaned_data['lider']
            #proyecto.estado=proyecto_edit_form.cleaned_data['estado']
            proyecto.save()
            return HttpResponseRedirect('/proyecto_edit/')
    elif 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyecto_edit_form = ProyectoEditForm(initial={'idproy':proyecto.id, 'nombre': proyecto.nombre, 'descripcion': proyecto.descripcion,
        'estado': proyecto.estado})
        idProyecto = proyecto.id
        proyectos = Proyecto.objects.all()
        variables = RequestContext(request, {
            'show_proyecto_list': False,
            'proyectos': proyectos,
            'idProyecto': idProyecto,
            'tipoadr': 'proyecto_edit',
            'proyecto_edit_form': proyecto_edit_form
        })
        return render_to_response('proyecto/editar_proyecto.html', variables)
    else:
        # formulario inicial
        proyecto_edit_form = ProyectoEditForm()
        show_proyecto_list = True
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        proyectos = Proyecto.objects.all().filter(nombre__icontains=buscar)
    else:
        proyectos = Proyecto.objects.all()
        searchform = SearchForm() 
    variables = RequestContext(request, {
        'show_proyecto_list': show_proyecto_list,
        'proyectos': proyectos,
        'idProyecto': idProyecto,
        'searchform': searchform,
		'tipoadr': 'proyecto_edit',
        'proyecto_edit_form': proyecto_edit_form
    })
    return render_to_response('proyecto/editar_proyecto.html', variables)

@login_required	
def leer_proyecto(request):
    """
    Vista que despliega una lista que contiene todos los proyectos existentes en el sistema, se mostrara la
    descripcion del proyecto seleccionado. 
    """
    if request.method == 'POST':
        proyecto = Proyecto.objects.get(nombre=request.POST['proyectoname'])
        return HttpResponseRedirect('/proyecto_read/')
    elif 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        #proyecto_edit_form = ProyectoEditForm({'nombre': proyecto.nombre , 'descripcion': proyecto.descripcion})
        proyectos = Proyecto.objects.all()
        variables = RequestContext(request, {
            'show_proyecto_list': False,
            'proyectos': proyectos,
            'tipoadr': 'proyecto_read',
            'proyecto': proyecto
        })
        return render_to_response('proyecto/read_proyecto.html', variables)
    else:
        proyecto_edit_form = ProyectoEditForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        proyectos = Proyecto.objects.all().filter(nombre__icontains=buscar)
    else:
        proyectos = Proyecto.objects.all()
        searchform = SearchForm() 
    variables = RequestContext(request, {
        'show_proyecto_list': True,
        'proyectos': proyectos,
        'searchform': searchform,
		'tipoadr': 'proyecto_read'
    })
    return render_to_response('proyecto/read_proyecto.html', variables)
	
@login_required
def eliminar_proyecto(request):
    """
    Vista que despliega una lista que contiene todos los proyectos existentes en el sistema, se mostrara la
    descripcion del proyecto seleccionado y podran ser eliminado, asi como todos sus artefactos. 
    """
    if request.method == 'POST':
        proyecto = Proyecto.objects.get(nombre=request.POST['proyectoname'])
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto)
        artefactos = Artefacto.objects.filter(proyecto=proyecto)
        proyecto.delete()
        return HttpResponseRedirect('/proyecto_read/')
    elif 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyectos = Proyecto.objects.all()
        variables = RequestContext(request, {
            'show_proyecto_list': False,
            'proyectos': proyectos,
            'tipoadr': 'proyecto_delete',
            'proyecto': proyecto
        })
        return render_to_response('delete_proyecto.html', variables)
    else:
        proyecto_edit_form = ProyectoEditForm()
    if 'buscar' in request.GET:
        searchform = SearchForm(request.GET)
        buscar = request.GET['buscar'].strip()
        proyectos = Proyecto.objects.all().filter(nombre__icontains=buscar)
    else:
        proyectos = Proyecto.objects.all()
        searchform = SearchForm() 
    variables = RequestContext(request, {
        'show_proyecto_list': True,
        'proyectos': proyectos,
        'searchform': searchform,
		'tipoadr': 'proyecto_delete'
    })
    return render_to_response('delete_proyecto.html', variables)

@login_required
def crearTipoArtefacto(request):
    """
    Vista que despliega los campos para introducir los datos de un nuevo tipo de artefacto, 
    dentro de un proyecto. Esta vista estara habilitada para el lider del proyecto.
    """
    proyId = 0
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=15)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #proyecto=Proyecto.objects.get(id=request.POST['idProy'])
        tipoform = TipoArtForm(request.POST, request.FILES)
        #tipoform.fields['projectname']=forms.CharField(max_length=64, widget=forms.HiddenInput(), required=False)
        #proyId=proyecto.id
        if tipoform.is_valid():
            proyecto = Proyecto.objects.get(nombre=tipoform.cleaned_data['proyecto'])
            tipoArt = TipoArtefacto.objects.get_or_create(nombre=tipoform.cleaned_data['nombre'],
                    #icono=tipoform.cleaned_data['icono'],
                    codigo=tipoform.cleaned_data['codigo'],
                    proyec_tipoar=proyecto,
                    fase=tipoform.cleaned_data['fase'],
                    is_active=True)
            #return HttpResponseRedirect('/proyecto/success/')
            if 'tiponame' in request.GET:
                proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                proyname = proyecto.nombre
                tipoArt=TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=proyecto)
                tipo_form = TipoArtForm({'nombre': tipoArt.nombre, 'codigo':tipoArt.codigo, 'proyecto':tipoArt.proyec_tipoar.nombre, 'fase':tipoArt.fase})# , 'icono': tipoArt.icono})
                tiposArt = TipoArtefacto.objects.all()
                variables = RequestContext(request, {
                    'show_tipo_list': False,
                    'tiposArt': tiposArt,
                    'tipoadr': 'tipoart_read',
                    'tipoArt': tipoArt,
                    'proyname':proyname,
                })
                return render_to_response('tipoartefacto/leer_tipoart.html', variables)
            elif 'proyectoname' in request.GET:
                show_tipo_list = True
                proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                proyname = proyecto.nombre
                tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
            variables = RequestContext(request, {
                'show_tipo_list': show_tipo_list,
                'tiposArt': tiposArt,
                'tipoadr': 'tipoart_read',
                'proyname':proyname,
            })
            return render_to_response('tipoartefacto/leer_tipoart.html', variables)
    elif 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyId = proyecto.id
        proyname = proyecto.nombre
        tipoform = TipoArtForm(initial={'proyecto': proyecto.nombre})
        variables = RequestContext(request, {
            'tipoform': tipoform,
            'idProy':proyId,
            'proyname':proyname
        })
        return render_to_response('tipoartefacto/tipoart_save.html', variables)
    else:
        tipoform = TipoArtForm()
    variables = RequestContext(request, {
        'tipoform': tipoform,
        'idProy':proyId
    })
    return render_to_response('tipoartefacto/tipoart_save.html', variables)

@login_required	
def editar_tipoart(request):
    """
    Vista que despliega los campos para modificar los datos de un tipo de artefacto existente dentro
    de un proyecto. Esta vista estara habilitada para el lider del proyecto.
    """
    show_tipo_list = False
    proyname = ''
    tiposArt = ''
    tipoform = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=16)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #proyecto=Proyecto.objects.get(id=request.POST['idProy'])
        tipoform = TipoArtEditForm(request.POST, request.FILES)
        #tipoform.fields['projectname']=forms.CharField(max_length=64, widget=forms.HiddenInput(), required=False)
        #proyId=proyecto.id
        if tipoform.is_valid():
            proyecto = Proyecto.objects.get(nombre=tipoform.cleaned_data['proyecto'])
            tipoArt = TipoArtefacto.objects.get(id=tipoform.cleaned_data['idtipo'])
            tipoArt.nombre = tipoform.cleaned_data['nombre']
            #tipoArt.icono = tipoform.cleaned_data['icono']
            tipoArt.codigo = tipoform.cleaned_data['codigo']
            tipoArt.proyec_tipoar = proyecto
            tipoArt.fase = tipoform.cleaned_data['fase']
            tipoArt.save()
            #return HttpResponseRedirect('/proyecto/success/')
            if 'proyectoname' in request.GET:
                show_tipo_list = True
                proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                proyname = proyecto.nombre
                tipoform = TipoArtEditForm()
                tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
            variables = RequestContext(request, {
                'show_tipo_list': show_tipo_list,
                'tiposArt': tiposArt,
                'tipoadr': 'tipoart_edit',
                'proyname':proyname,
                'tipo_edit_form': tipoform
            })
            return render_to_response('tipoartefacto/editar_tipoart.html', variables)
    elif 'tiponame' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        tipoArt = TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=proyecto)
        tipoform = TipoArtEditForm(initial={'idtipo':tipoArt.id, 'nombre': tipoArt.nombre, 'codigo':tipoArt.codigo, 'proyecto':tipoArt.proyec_tipoar.nombre, 'fase':tipoArt.fase})#, 'icono': tipoArt.icono})
        idTipo = tipoArt.id
        tiposArt = TipoArtefacto.objects.all()
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'tiposArt': tiposArt,
            'idTipo': idTipo,
            'tipoadr': 'tipoart_edit',
            'proyname':proyname,
            'tipo_edit_form': tipoform
        })
        return render_to_response('tipoartefacto/editar_tipoart.html', variables)
    elif 'proyectoname' in request.GET:
        show_tipo_list = True
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        tipoform = TipoArtEditForm()
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
    variables = RequestContext(request, {
        'show_tipo_list': show_tipo_list,
        'tiposArt': tiposArt,
		'tipoadr': 'tipoart_edit',
        'proyname':proyname,
        'tipo_edit_form': tipoform
    })
    return render_to_response('tipoartefacto/editar_tipoart.html', variables)	

@login_required	
def leer_tipoart(request):
    """
    Vista que despliega una lista que contiene todos los tipos de artefacto existentes dentro de
    un proyecto, se mostrara la descripcion del tipo de artefacto seleccionado. Esta vista estara 
    habilitada para el lider del proyecto.
    """
    show_tipo_list = False
    proyname = ''
    tiposArt = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=14)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        tipoart = TipoArtefacto.objects.get(nombre=request.POST['tiponame'])
        return HttpResponseRedirect('/proyecto/success')
    elif 'tiponame' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        tipoArt = TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=proyecto)
        tipo_form = TipoArtForm({'nombre': tipoArt.nombre, 'codigo':tipoArt.codigo, 'proyecto':tipoArt.proyec_tipoar.nombre, 'fase':tipoArt.fase})#, 'icono': tipoArt.icono})
        tiposArt = TipoArtefacto.objects.all()
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'tiposArt': tiposArt,
            'tipoadr': 'tipoart_read',
            'tipoArt': tipoArt,
            'proyname':proyname,
        })
        return render_to_response('tipoartefacto/leer_tipoart.html', variables)
    elif 'proyectoname' in request.GET:
        show_tipo_list = True
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
    variables = RequestContext(request, {
        'show_tipo_list': show_tipo_list,
        'tiposArt': tiposArt,
        'tipoadr': 'tipoart_read',
        'proyname':proyname,
    })
    return render_to_response('tipoartefacto/leer_tipoart.html', variables)

@login_required	
def eliminar_tipoart(request):
    """
    Vista que despliega una lista que contiene todos los tipos de artefacto dentro de un proyecto, se mostrara la
    descripcion del tipo de artefacto seleccionado y podra ser eliminado. Esta vista estara habilitada para 
    el lider del proyecto.
    """
    show_tipo_list = False
    proyname = ''
    tiposArt = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=17)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #user=Usuario.objects.get(username=request.POST['username'])
        tipoart = TipoArtefacto.objects.get(id=request.POST['idtipo'])
        tipoart.is_active=False
        tipoart.save()
        #return HttpResponseRedirect('/proyecto/success')
        if 'proyectoname' in request.GET:
            show_tipo_list = True
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
        variables = RequestContext(request, {
            'show_tipo_list': show_tipo_list,
            'tiposArt': tiposArt,
            'tipoadr': 'tipoart_delete',
            'proyname':proyname,
        })
        return render_to_response('tipoartefacto/eliminar_tipoart.html', variables)
    elif 'tiponame' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        tipoArt = TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=proyecto)
        #tipo_form = TipoArtEditForm({'idtipo':tipoArt.id, 'nombre': tipoArt.nombre, 'codigo':tipoArt.codigo, 'proyecto':tipoArt.proyec_tipoar.nombre, 'fase':tipoArt.fase, 'icono': tipoArt.icono})
        tiposArt = TipoArtefacto.objects.all()
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'tiposArt': tiposArt,
            'tipoadr': 'tipoart_delete',
            'tipoArt': tipoArt,
            'proyname':proyname,
        })
        return render_to_response('tipoartefacto/eliminar_tipoart.html', variables)
    elif 'proyectoname' in request.GET:
        show_tipo_list = True
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
    variables = RequestContext(request, {
        'show_tipo_list': show_tipo_list,
        'tiposArt': tiposArt,
        'tipoadr': 'tipoart_delete',
        'proyname':proyname,
    })
    return render_to_response('tipoartefacto/eliminar_tipoart.html', variables)
	
	
@login_required		
def crearArtefactoAn(request):
    """
    Vista que despliega los campos para introducir los datos de un nuevo artefacto de la fase de analisis,
    dentro de un proyecto.
    """
    permitido = False
    proyId = ''
    adj = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=19)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        artefactoform = ArtefactoAnForm(request.POST, request.FILES)
        #proyecto=Proyecto.objects.get(id=request.POST['idProy'])
        proyecto = Proyecto.objects.get(id=artefactoform.data['idproy'])
        proyname = proyecto.nombre
        if artefactoform.is_valid():
            arts_tipo = Artefacto.objects.filter(proyecto=proyecto, tipoArtefacto=artefactoform.cleaned_data['tipoArtefacto']).order_by('nro_Artefacto')
            numero = 1
            if arts_tipo:
                for art in arts_tipo:
                    numero = art.nro_Artefacto+1
            archivo = artefactoform.cleaned_data['adjunto']
            artefacto = Artefacto.objects.get_or_create(nombre=artefactoform.cleaned_data['nombre'],
                        descripcionBreve= artefactoform.cleaned_data['descr_breve'],
                        descripcionDetallada= artefactoform.cleaned_data['descr_detallada'],
                        tipoArtefacto=artefactoform.cleaned_data['tipoArtefacto'],
                        proyecto=proyecto,
                        nro_Artefacto=numero,
                        version=1,
                        complejidad=artefactoform.cleaned_data['complejidad'],
                        fase='A',
                        #adjunto=Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size),
                        user_creado=Usuario.objects.get(username=request.user.username),
                        estado='I',
                        historico='A', fecha=datetime.now())
            artefacto = Artefacto.objects.get(nombre=artefactoform.cleaned_data['nombre'], proyecto=proyecto)
            if archivo:
                artefacto.adjunto = Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size)
                artefacto.save()
            for art in artefactoform.cleaned_data['relacionhijo']:
                Relacion.objects.create(padre=artefacto, hijo=art)
            #return HttpResponseRedirect('/proyecto/success/')
            if 'idArt' in request.GET:
                art = Artefacto.objects.get(id=request.GET['idArt'])
                proyname = art.proyecto.nombre
                variables = RequestContext(request, {
                    'show_tipo_list': False,
                    'proyname': proyname,
                    'tipoadr': 'artan_read',
                    'artefacto': art
                })
                return render_to_response('read_artefacto.html', variables)   
            elif 'proyectoname' in request.GET:
                try:
                    proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                    proyname = proyecto.nombre
                    #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
                    artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
                except:
                    raise Http404(u'Request not found.')
                variables = RequestContext(request, {
                    'show_art_list': True,
                    'proyname': proyname,
                    'artefactos': artefactos,
                    'tipoadr': 'artan_read'
                })
                return render_to_response('read_artefacto.html', variables)
            variables = RequestContext(request)
            return render_to_response('read_artefacto.html', variables)
        else:
            artefactoform.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True), required=False)
            artefactoform.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre__historico='A').values_list('hijo', flat=True)),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
    elif 'proyectoname' in request.GET:
        userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyId = proyecto.id
        proyname = proyecto.nombre
        artefactoform = ArtefactoAnForm(initial={'idproy':proyId})
        artefactoform.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(fase='A').filter(is_active=True), required=False)
        #relacionhijoform= RelacionHijo()
        #filtra los artefactos que ya tienen padres
        artefactoform.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.filter(padre__historico='A').values_list('hijo', flat=True)),
                                        #queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        variables = RequestContext(request, {
            'artefactoform': artefactoform,
            'idProy':proyId,
            'proyname':proyname
        })
        return render_to_response('artefacto_save.html', variables)
    variables = RequestContext(request, {
        'artefactoform': artefactoform,
        'idProy':proyId,
        'proyname':proyname
    })
    return render_to_response('artefacto_save.html', variables)

@login_required	
def asignar_rol_op(request):
    """
    Vista desplegada para asignar roles operativos.
    """
    permitido = False
    if request.method == 'POST':
        rol_op_form = RolAsOpForm(request.POST)
        idUser = request.POST['idUser']
        idProy = request.POST['idProy']
        if rol_op_form.is_valid():
            user = Usuario.objects.get(id=idUser)
            proyecto = Proyecto.objects.get(id=idProy)
            for rol in rol_op_form.cleaned_data['rolop']:
                try:
                    UsRolPro.objects.get(usuario=user, rol=rol)
                except UsRolPro.DoesNotExist:
                    us_rol_proy = UsRolPro.objects.create(usuario=user, rol=rol, proyecto=proyecto)
            return HttpResponseRedirect('/asing_op?proyectoname=%s' % proyecto.nombre)
    elif 'username' in request.GET:
        if 'projectname' in request.GET:
            user = Usuario.objects.get(username=request.GET['username'])
            userlog = Usuario.objects.get(username=request.user.username)
            project = Proyecto.objects.get(nombre=request.GET['projectname'])
            us_rol_pro = UsRolPro.objects.filter(usuario=userlog).filter(proyecto=project)
            for rol in us_rol_pro:
                perms = rol.rol.rol_permiso.all()
                for perm in perms:
                    if perm.id == 30:
                        permitido = True
            idUser = user.id
            idProy = project.id
            proyectoname = project.nombre
            username = user.username
            dict = {}
            for rolpro in UsRolPro.objects.filter(usuario=user, proyecto=project):
                dict[rolpro.rol.id] = True
            rol_op_form = RolAsOpForm({'rolop':dict})
            variables = RequestContext(request, {
                'show_user_list': False,
                'permitido':permitido,
                'username': username,
                'idUser': idUser,
                'idProy':idProy,
                'proyectoname': proyectoname,
                'rol_op_form': rol_op_form
            })
            return render_to_response('asing_op.html', variables)
    elif 'proyectoname' in request.GET:
        userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
        proyect = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        #perm = Permiso.objcts.get(id=30)
        #busca si posee el permiso necesario
        us_rol_pro=UsRolPro.objects.filter(usuario=userlog).filter(proyecto=proyect)
        for rol in us_rol_pro:
            perms = rol.rol.rol_permiso.all()
            for perm in perms:
                if perm.id == 30:
                    permitido = True
        usuarios = Usuario.objects.filter(is_active=True)
        variables = RequestContext(request, {
            'show_user_list': True,
            'permitido':permitido,
            'proyecto':proyect,
            'usuarios': usuarios,
            'proyectoname': proyect.nombre,
            'tipoadr': 'asing_op'
        })
        return render_to_response('asing_op.html', variables)
    else:
        rol_op_form = RolAsOpForm()
    variables = RequestContext(request)
    return render_to_response('asing_adm.html', variables)

    
@login_required	
def leer_artefactoan(request):
    """
    Vista que despliega una lista que contiene todos los artefactos de la fase de analisis,
    existentes dentro de un proyecto, se mostrara la descripcion del artefacto seleccionado. 
    """
    #if request.method == 'POST':
    #    artefacto=Artefacto.objects.get(id=request.POST['idArt'])
    #    return HttpResponseRedirect('/proyecto/success')
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    #perm = Permiso.objects.get(id=18)
    #if not usuario.has_perm(perm):
    #    return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        #art_edit_form = ArtefactoAnForm({'nombre': art.nombre, 'descr_breve': art.descripcionBreve, 'descr_detallada':art.descripcionDetallada})
        proyname = art.proyecto.nombre
        padre = ''
        for rel in Relacion.objects.filter(padre__historico='A').filter(hijo=art, between=False) :
            padre = rel.padre
        artrelhijo = Artefacto.objects.filter(id__in=Relacion.objects.filter(padre=art, between=False).values_list('hijo', flat=True))
        artrelpar = Artefacto.objects.filter(id__in=Relacion.objects.filter(padre=art, between=True).values_list('hijo', flat=True))
        artrelpar = artrelpar|Artefacto.objects.filter(id__in=Relacion.objects.filter(hijo=art, between=True).values_list('padre', flat=True))
        #artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname': proyname,
            #'artefactos': artefactos,
            'tipoadr': 'artan_read',
            'artRelHijo': artrelhijo,
            'artRelPar': artrelpar.order_by('fase'),
            'padre': padre,
            'artefacto': art
        })
        return render_to_response('read_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        
        try:
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
            #art=Artefacto.objects.get(id=30)
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'show_art_list': True,
            'proyname': proyname,
            'artefactos': artefactos,
            'mediaroot': MEDIA_ROOT,
            #'prueba': art.adjunto,
            'tipoadr': 'artan_read'
        })
        return render_to_response('read_artefacto.html', variables)
    variables = RequestContext(request)
    return render_to_response('read_artefacto.html', variables)

@login_required	
def bajaradjunto(request):
    """
    Vista para visualizar el archivo adjunto que pertenece al artefacto.
    """
    if 'idadj' in request.GET:
            elArchivo = Archivo.objects.get(id=request.GET['idadj'])
            response = HttpResponse(base64.b64decode(elArchivo.contenido), content_type='application/octet-stream')
            response['Content-Disposition'] = 'filename=%s' % elArchivo.nombre
            response['Content-Length'] = elArchivo.tamano
            return response
    return response
@login_required	
def editar_artefactoan(request):
    """
    Vista que despliega los campos para modificar los datos de un artefacto de la fase de analisis, que
    existe dentro de un proyecto. 
    """
    show_art_list = False
    idProy = ''
    artefactos = ''
    proyname = ''
    art_edit_form = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=20)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        art_edit_form = ArtefactoAnEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        #proyecto =Proyecto.objects.get(id=art_edit_form.data['idproy'])
        idProy = proyecto.id
        artef = Artefacto.objects.get(id=request.POST['idart'])
        proyname = proyecto.nombre
        if art_edit_form.is_valid():
            artef = Artefacto.objects.get(id=art_edit_form.data['idart'])
            tipoArt = TipoArtefacto.objects.get(nombre=art_edit_form.cleaned_data['tipoArtefacto'], proyec_tipoar=proyecto)
            numero = artef.nro_Artefacto
            try:
                adjedit = art_edit_form.cleaned_data['adjunto']
                artefacto = Artefacto.objects.get(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            #descripcionDetallada= art_edit_form.cleaned_data['descr_detallada'],
                            tipoArtefacto=tipoArt,
                            #proyecto=proyecto,
                            nro_Artefacto=numero,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            #fase= 'A',
                            #adjunto=art_edit_form.cleaned_data['adjunto'],
                            #user_creado=Usuario.objects.get(username=request.user.username),
                            #estado='I',
                            historico='A',
                            )
                if artefacto.descripcionDetallada == art_edit_form.cleaned_data['descr_detallada']:
                    if adjedit:
                        if artefacto.adjunto:
                            if not artefacto.adjunto.nombre == adjedit.name and artefacto.adjunto.contenido == base64.b64encode(adjedit.read()):
                                Artefacto.objects.get(id=0)
                        else:
                            Artefacto.objects.get(id=0)
                    for art in art_edit_form.cleaned_data['relacionhijo']:
                        if not art.id in Relacion.objects.filter(padre=artefacto).filter(between=False).values_list('padre', flat=True):
                            Artefacto.objects.get(id=0)
                    for id in Relacion.objects.filter(padre=artefacto).filter(between=False).values_list('padre', flat=True):
                        if not Artefacto.objects.get(id=id) in art_edit_form.cleaned_data['relacionhijo']:
                            Artefacto.objects.get(id=0)
                    return HttpResponseRedirect('/artan_edit/?proyectoname=%s' %  proyecto.nombre)
                else:
                    Artefacto.objects.get(id=0)
            except Artefacto.DoesNotExist:
                artef.historico = 'H'
                artef.save()
                archivo=art_edit_form.cleaned_data['adjunto']
                artefacto = Artefacto.objects.create(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            descripcionDetallada= art_edit_form.cleaned_data['descr_detallada'],
                            tipoArtefacto=tipoArt,
                            proyecto=proyecto,
                            nro_Artefacto=numero,
                            version=artef.version + 1,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            fase= 'A',
                            user_creado=Usuario.objects.get(username=request.user.username),
                            estado='M',
                            historico='A',
                            fecha=datetime.now()
                            )
                artefacto = Artefacto.objects.get(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            tipoArtefacto=tipoArt,
                            nro_Artefacto=numero,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            historico='A',
                            )
                if archivo:
                    artefacto.adjunto = Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size)
                    artefacto.save()
                else:
                    artefacto.adjunto = artef.adjunto
                    artefacto.save()
                for art in art_edit_form.cleaned_data['relacionhijo']:
                    Relacion.objects.create(padre=artefacto, hijo=art)
                for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
            return HttpResponseRedirect('/artan_edit/?proyectoname=%s' %  proyecto.nombre)
        else:
            #art_edit_form.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto), required=False)    
            art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=artef).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(artef).values_list('padre', flat=True)).exclude(id=artef.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
    elif 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        art = Artefacto.objects.get(id=request.GET['idArt'])
        art_edit_form = ArtefactoAnEditForm(initial={'idart':art.id,
                                                    'idproy':proyecto.id,
                                                    'nombre': art.nombre,
                                                    'descr_breve': art.descripcionBreve,
                                                    'descr_detallada':art.descripcionDetallada,
                                                    'complejidad':art.complejidad,
                                                    'adjunto':art.adjunto,
                                                    'tipoArtefacto':art.tipoArtefacto.get_nombre()})
        art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        art_edit_form.fields['relacionhijo'].initial=[rel.hijo.id for rel in Relacion.objects.filter(padre=art, between=False)]
        artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artan_edit',
            'art_edit_form': art_edit_form
        })
        return render_to_response('artefacto/edit_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        show_art_list = True
        try:
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            idProy = proyecto.id
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            
        except:
            raise Http404(u'Request not found.')
        artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
    variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artan_edit',
            'art_edit_form': art_edit_form
        })
    return render_to_response('artefacto/edit_artefacto.html', variables)

@login_required	
def eliminar_artefactoan(request):
    """
    Vista que despliega una lista que contiene todos los artefactos de la fase de analisis
    dentro de un proyecto, se mostrara la descripcion del artefacto seleccionado y 
    podra ser eliminado. 
    """
    show_art_list = False
    idProy = ''
    artefactos = ''
    proyname = ''
    artefact = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=21)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #art_edit_form = ArtefactoAnEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        proyname = proyecto.nombre
        artef = Artefacto.objects.get(id=request.POST['idArt'])
        artef.historico = 'H'
        artef.save()
        artefacto = Artefacto.objects.create(nombre=artef.nombre,
                            descripcionBreve= artef.descripcionBreve,
                            descripcionDetallada= artef.descripcionDetallada,
                            tipoArtefacto=artef.tipoArtefacto,
                            proyecto=artef.proyecto,
                            nro_Artefacto=artef.nro_Artefacto,
                            version=artef.version + 1,
                            complejidad=artef.complejidad,
                            fase= 'A',
                            adjunto=artef.adjunto,
                            user_creado=Usuario.objects.get(username=request.user.username),
                            estado='E',
                            historico='E',
                            fecha=datetime.now()
                            )
        #return HttpResponseRedirect('/proyecto/success/')
        if 'proyectoname' in request.GET:
            show_art_list=True
            try:
                proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                proyname = proyecto.nombre
                idProy = proyecto.id
            except:
                raise Http404(u'Request not found.')
            artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artan_delete',
            'artefact': artefact
        })
        return render_to_response('artefacto/delete_artefacto.html', variables)
    elif 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        artefact = Artefacto.objects.get(id=request.GET['idArt'])
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artan_delete',
            'artefact': artefact
        })
        return render_to_response('artefacto/delete_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        show_art_list=True
        try:
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            idProy = proyecto.id
        except:
            raise Http404(u'Request not found.')
        artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
    variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artan_delete',
            'artefact': artefact
        })
    return render_to_response('artefacto/delete_artefacto.html', variables)

def ancestro(artefacto):
    """
    Funcion que obtiene el ancestro de un artefacto, un ancestro puede ser un padre, un abuelo, un
    visabuelo, etc.
    :param artefacto: Artefacto que desea conocer a sus ancestros.
    :return: Retorna las relaciones que tiene el artefacto con sus ancestros.
    """
    relaciones = Relacion.objects.filter(between=False).filter(hijo=artefacto).filter(padre__historico='A')
    relations = relaciones
    for rel in relaciones:
    #relations|ancestro(rel.padre)
        return relations|ancestro(rel.padre)
    return relaciones
    
@login_required	
def gen_lineaba_an(request):
    """
    Funcion que verifica que todos los artefactos de la fase de analisis esten aprobados y genera la linea base.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=32)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'proyectoname' in request.GET:
        aprobados = True
        existe = True
        try:
            noaprobadoslist = []
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A', historico='A')
            #Comprueba que todos los artefactos esten aprobados
            if not artefactos:
                existe = False
                aprobados = False
            for art in artefactos:
                if not art.estado == 'A':
                    aprobados=False
                    noaprobadoslist.append(art)
            if aprobados:
                LineaBase.objects.create(proyecto=proyecto, fase=proyecto.fase_actual)
                linbase = LineaBase.objects.get(proyecto=proyecto, fase=proyecto.fase_actual)
                for art in artefactos:
                    art.estado = 'B'
                    art.lineaBase = linbase
                    art.save()
                proyecto.fase_actual = 'D'
                proyecto.save()
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'existe': existe,
            'noaprobadoslist': noaprobadoslist,
            'aprobados': aprobados,
            'proyecto':proyecto,
            'tipoadr': 'artan_read'
        })
        return render_to_response('gen_linbasea.html', variables)
    variables = RequestContext(request)
    return render_to_response('gen_linbasea.html', variables)

@login_required
def apro_artan(request):
    """
    Funcion que aprueba los artefactos de la fase de analisis.
    """
    #if request.method == 'POST':
    #    artefacto=Artefacto.objects.get(id=request.POST['idArt'])
    #    return HttpResponseRedirect('/proyecto/success')
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=36)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        artefact = Artefacto.objects.get(id=request.GET['idArt'])
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'aprobar_an',
            'artefact': artefact
        })
        return render_to_response('aprobar_artan.html', variables)   
    elif 'proyectoname' in request.GET:
        try:
            if 'idApro' in request.GET:
                art = Artefacto.objects.get(id=request.GET['idApro'])
                if art.fase=='A':
                    art.estado='A'
                    art.save()
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').exclude(estado='A').order_by('tipoArtefacto', 'nro_Artefacto')
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'show_art_list': True,
            'artefactos': artefactos,
            'proyname':proyname,
            'tipoadr': 'aprobar_an'
        })
        return render_to_response('aprobar_artan.html', variables)
    variables = RequestContext(request)
    return render_to_response('aprobar_artan.html', variables)

@login_required	
def apro_artdi(request):
    """
    Funcion que aprueba los artefactos de la fase de disenyo.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=35)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        artefact=Artefacto.objects.get(id=request.GET['idArt'])
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'aprobar_di',
            'artefact': artefact
        })
        return render_to_response('aprobar_artdi.html', variables)   
    elif 'proyectoname' in request.GET:
        try:
            if 'idApro' in request.GET:
                art=Artefacto.objects.get(id=request.GET['idApro'])
                if art.fase=='D':
                    art.estado='A'
                    art.save()
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').filter(historico='A').exclude(estado='A').order_by('tipoArtefacto', 'nro_Artefacto')
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'show_art_list': True,
            'artefactos': artefactos,
            'proyname':proyname,
            'tipoadr': 'aprobar_di'
        })
        return render_to_response('aprobar_artdi.html', variables)
    variables = RequestContext(request)
    return render_to_response('aprobar_artdi.html', variables)

@login_required	
def leer_artefactodi(request):
    """
    Vista que despliega una lista que contiene todos los artefactos de la fase de disenyo
    existentes dentro de un proyecto, se mostrara la descripcion del artefacto seleccionado. 
    """
    #if request.method == 'POST':
    #    artefacto=Artefacto.objects.get(id=request.POST['idArt'])
    #    return HttpResponseRedirect('/proyecto/success')
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    #perm = Permiso.objects.get(id=22)
    #if not usuario.has_perm(perm):
    #    return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        #art_edit_form = ArtefactoAnForm({'nombre': art.nombre, 'descr_breve': art.descripcionBreve, 'descr_detallada':art.descripcionDetallada})
        proyname = art.proyecto.nombre
        padre = ''
        for rel in Relacion.objects.filter(padre__historico='A').filter(hijo=art, between=False) :
            padre = rel.padre
        artrelhijo = Artefacto.objects.filter(id__in=Relacion.objects.filter(padre=art, between=False).values_list('hijo', flat=True))
        artrelpar = Artefacto.objects.filter(id__in=Relacion.objects.filter(padre=art, between=True).values_list('hijo', flat=True))
        artrelpar = artrelpar|Artefacto.objects.filter(id__in=Relacion.objects.filter(hijo=art, between=True).values_list('padre', flat=True))
        #artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname': proyname,
            'artRelHijo': artrelhijo,
            'artRelPar': artrelpar.order_by('fase'),
            'padre': padre,
            'tipoadr': 'artdi_read',
            'artefacto': art
        })
        return render_to_response('read_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        
        try:
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'show_art_list': True,
            'proyname': proyname,
            'artefactos': artefactos,
            'tipoadr': 'artdi_read'
        })
        return render_to_response('read_artefacto.html', variables)
    variables = RequestContext(request)
    return render_to_response('read_artefacto.html', variables)

@login_required
def crearArtefactoDi(request):
    """
    Vista que despliega los campos para introducir los datos de un nuevo artefacto de la fase de disenyo,
    dentro de un proyecto.
    """
    permitido = False
    proyId = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=23)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        artefactoform = ArtefactoDiForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=artefactoform.data['idproy'])
        proyname=proyecto.nombre
        if artefactoform.is_valid():
            arts_tipo=Artefacto.objects.filter(proyecto=proyecto, tipoArtefacto=artefactoform.cleaned_data['tipoArtefacto']).order_by('nro_Artefacto')
            numero = 1
            if arts_tipo:
                for art in arts_tipo:
                    numero = art.nro_Artefacto+1
            archivo = artefactoform.cleaned_data['adjunto']
            artefacto = Artefacto.objects.get_or_create(nombre=artefactoform.cleaned_data['nombre'],
                        descripcionBreve= artefactoform.cleaned_data['descr_breve'],
                        descripcionDetallada= artefactoform.cleaned_data['descr_detallada'],
                        tipoArtefacto=artefactoform.cleaned_data['tipoArtefacto'],
                        proyecto=proyecto,
                        nro_Artefacto=numero,
                        version=1,
                        complejidad=artefactoform.cleaned_data['complejidad'],
                        fase= 'D',
                        user_creado=Usuario.objects.get(username=request.user.username),
                        estado='I',
                        historico='A', fecha=datetime.now())
            artefacto = Artefacto.objects.get(nombre=artefactoform.cleaned_data['nombre'], proyecto=proyecto)
            if archivo:
                artefacto.adjunto = Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size)
                artefacto.save()
            for art in artefactoform.cleaned_data['relacionhijo']:
                Relacion.objects.create(padre=artefacto, hijo=art)
            for art in artefactoform.cleaned_data['relacionpar']:
                Relacion.objects.create(padre=artefacto, hijo=art, between=True)
            #return HttpResponseRedirect('/proyecto/success/')
            if 'idArt' in request.GET:
                art = Artefacto.objects.get(id=request.GET['idArt'])
                proyname = art.proyecto.nombre
                variables = RequestContext(request, {
                    'show_tipo_list': False,
                    'proyname': proyname,
                    'tipoadr': 'artdi_read',
                    'artefacto': art
                })
                return render_to_response('read_artefacto.html', variables)   
            elif 'proyectoname' in request.GET:
        
                try:
            
                    proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                    proyname = proyecto.nombre
                    #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
                    artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
                except:
                    raise Http404(u'Request not found.')
                variables = RequestContext(request, {
                    'show_art_list': True,
                    'proyname': proyname,
                    'artefactos': artefactos,
                    'tipoadr': 'artdi_read'
                })
                return render_to_response('read_artefacto.html', variables)
            variables = RequestContext(request)
            return render_to_response('read_artefacto.html', variables)
        else:
            artefactoform.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True), required=False)
            artefactoform.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre__historico='A').values_list('hijo', flat=True)),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
            artefactoform.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A'),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
    elif 'proyectoname' in request.GET:
        userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyId = proyecto.id
        proyname=proyecto.nombre
        artefactoform = ArtefactoDiForm(initial={'idproy':proyId})
        artefactoform.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True).filter(fase='D'), required=False)
        #relacionhijoform= RelacionHijo()
        #filtra los artefactos que ya tienen padres
        artefactoform.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D').exclude(id__in=Relacion.objects.filter(padre__historico='A').values_list('hijo', flat=True)),
                                        #queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        artefactoform.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A'),
                                        #queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        variables = RequestContext(request, {
            'artefactoform': artefactoform,
            'idProy':proyId,
            'proyname':proyname
        })
        return render_to_response('artefacto_save.html', variables)
    variables = RequestContext(request, {
        'artefactoform': artefactoform,
        'idProy':proyId,
        'proyname':proyname
    })
    return render_to_response('artefacto_save.html', variables)

@login_required
def editar_artefactodi(request):
    """
    Vista que despliega los campos para modificar los datos de un artefacto de la fase de disenyo, que
    existe dentro de un proyecto. 
    """
    show_art_list = False
    idProy = ''
    artefactos = ''
    proyname = ''
    art_edit_form = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=24)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        art_edit_form = ArtefactoDiEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        idProy = proyecto.id
        artef = Artefacto.objects.get(id=request.POST['idart'])
        proyname = proyecto.nombre
        if art_edit_form.is_valid():
            artef = Artefacto.objects.get(id=art_edit_form.data['idart'])
            tipoArt = TipoArtefacto.objects.get(nombre=art_edit_form.cleaned_data['tipoArtefacto'], proyec_tipoar=proyecto)
            numero = artef.nro_Artefacto
            try:
                adjedit = art_edit_form.cleaned_data['adjunto']
                artefacto = Artefacto.objects.get(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            tipoArtefacto=tipoArt,
                            nro_Artefacto=numero,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            historico='A',
                            )
                if artefacto.descripcionDetallada == art_edit_form.cleaned_data['descr_detallada']:
                    if adjedit:
                        if artefacto.adjunto:
                            if not artefacto.adjunto.nombre == adjedit.name and artefacto.adjunto.contenido == base64.b64encode(adjedit.read()):
                                Artefacto.objects.get(id=0)
                        else:
                            Artefacto.objects.get(id=0)
                    for art in art_edit_form.cleaned_data['relacionhijo']:
                        if not art.id in Relacion.objects.filter(padre=artefacto).filter(between=False).values_list('padre', flat=True):
                            Artefacto.objects.get(id=0)
                    for id in Relacion.objects.filter(padre=artefacto).filter(between=False).values_list('padre', flat=True):
                        if not Artefacto.objects.get(id=id) in art_edit_form.cleaned_data['relacionhijo']:
                            Artefacto.objects.get(id=0)
                    for art in art_edit_form.cleaned_data['relacionpar']:
                        if not art.id in Relacion.objects.filter(padre=artefacto).filter(between=True).values_list('padre', flat=True):
                            Artefacto.objects.get(id=0)
                    for id in Relacion.objects.filter(padre=artefacto).filter(between=True).values_list('padre', flat=True):
                        if not Artefacto.objects.get(id=id) in art_edit_form.cleaned_data['relacionpar']:
                            Artefacto.objects.get(id=0)
                    return HttpResponseRedirect('/artdi_edit/?proyectoname=%s' %  proyecto.nombre)
                else:
                    Artefacto.objects.get(id=0)
            except Artefacto.DoesNotExist:
                artef.historico = 'H'
                artef.save()
                archivo=art_edit_form.cleaned_data['adjunto']
                artefacto = Artefacto.objects.create(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            descripcionDetallada= art_edit_form.cleaned_data['descr_detallada'],
                            tipoArtefacto=tipoArt,
                            proyecto=proyecto,
                            nro_Artefacto=numero,
                            version=artef.version + 1,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            fase= 'D', adjunto=art_edit_form.cleaned_data['adjunto'],
                            user_creado=Usuario.objects.get(username=request.user.username),
                            estado='M',
                            historico='A',
                            fecha=datetime.now()
                            )
                artefacto = Artefacto.objects.get(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            tipoArtefacto=tipoArt,
                            nro_Artefacto=numero,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            historico='A',
                            )
                if archivo:
                    artefacto.adjunto = Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size)
                    artefacto.save()
                else:
                    artefacto.adjunto = artef.adjunto
                    artefacto.save()
                for art in art_edit_form.cleaned_data['relacionhijo']:
                    Relacion.objects.create(padre=artefacto, hijo=art)
                for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
                    
                for art in art_edit_form.cleaned_data['relacionpar']:
                    Relacion.objects.create(padre=artefacto, hijo=art, between=True)
                #for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                #    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
            return HttpResponseRedirect('/artdi_edit/?proyectoname=%s' %  proyecto.nombre)

        else:
            #art_edit_form.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto), required=False)    
            #art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
            #                            queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
            #                            required=False)
            art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D').exclude(id__in=Relacion.objects.exclude(padre=artef).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(artef).values_list('padre', flat=True)).exclude(id=artef.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
            art_edit_form.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A'),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
    elif 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        art = Artefacto.objects.get(id=request.GET['idArt'])
        art_edit_form = ArtefactoDiEditForm(initial={'idart':art.id,
                                                    'idproy':proyecto.id,
                                                    'nombre': art.nombre,
                                                    'descr_breve': art.descripcionBreve,
                                                    'descr_detallada':art.descripcionDetallada,
                                                    'complejidad':art.complejidad,
                                                    'adjunto':art.adjunto,
                                                    'tipoArtefacto':art.tipoArtefacto.get_nombre()})
        art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D').exclude(id__in=Relacion.objects.exclude(padre=art).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        art_edit_form.fields['relacionhijo'].initial=[rel.hijo.id for rel in Relacion.objects.filter(padre=art, between=False)]
        art_edit_form.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A'),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        art_edit_form.fields['relacionpar'].initial=[rel.hijo.pk for rel in Relacion.objects.filter(padre=art, between=True)]
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artdi_edit',
            'art_edit_form': art_edit_form
        })
        return render_to_response('artefacto/edit_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        show_art_list = True
        try:
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            idProy = proyecto.id
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            
        except:
            raise Http404(u'Request not found.')
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
    variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artdi_edit',
            'art_edit_form': art_edit_form
        })
    return render_to_response('artefacto/edit_artefacto.html', variables)
    

@login_required	
def eliminar_artefactodi(request):
    """
    Vista que despliega una lista que contiene todos los artefactos de la fase de disenyo
    dentro de un proyecto, se mostrara la descripcion del artefacto seleccionado y 
    podra ser eliminado. 
    """
    show_art_list = False
    idProy = ''
    artefactos = ''
    proyname = ''
    artefact = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=25)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #art_edit_form = ArtefactoAnEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        proyname = proyecto.nombre
        artef = Artefacto.objects.get(id=request.POST['idArt'])
        artef.historico = 'H'
        artef.save()
        Artefacto.objects.create(nombre=artef.nombre,
                            descripcionBreve= artef.descripcionBreve,
                            descripcionDetallada= artef.descripcionDetallada,
                            tipoArtefacto=artef.tipoArtefacto,
                            proyecto=artef.proyecto,
                            nro_Artefacto=artef.nro_Artefacto,
                            version=artef.version + 1,
                            complejidad=artef.complejidad,
                            fase= 'D',
                            adjunto=artef.adjunto,
                            user_creado=Usuario.objects.get(username=request.user.username),
                            estado='E',
                            historico='E',
                            fecha=datetime.now()
                            )
        #return HttpResponseRedirect('/proyecto/success/')
        if 'proyectoname' in request.GET:
            show_art_list = True
            try:
                proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                proyname = proyecto.nombre
                idProy = proyecto.id
            except:
                raise Http404(u'Request not found.')
            artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artdi_delete',
            'artefact': artefact
        })
        return render_to_response('artefacto/delete_artefacto.html', variables)
    elif 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        artefact = Artefacto.objects.get(id=request.GET['idArt'])
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artdi_delete',
            'artefact': artefact
        })
        return render_to_response('artefacto/delete_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        show_art_list = True
        try:
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            idProy = proyecto.id
        except:
            raise Http404(u'Request not found.')
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
    variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artdi_delete',
            'artefact': artefact
        })
    return render_to_response('artefacto/delete_artefacto.html', variables)
    
@login_required	
def gen_lineaba_di(request):
    """
    Funcion que verifica que todos los artefactos de la fase de disenyo esten aprobados, que todos
    los artefactos tengan relacion con algun artefacto de la fase de analisis y que todos los artefactos
    de la fase de analisis tengan relacion con los artefactos de esta fase, una vez verificados estos 
    requerimientos se genera la linea base.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=33)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'proyectoname' in request.GET:
        aprobados = True
        seguimiento = True
        relacionados = True
        existe = True
        try:
            noaprobadoslist = []
            norelacionadoslist = []
            noseguimientolist = []
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='D', historico='A')
            if not artefactos:
                existe = False
                aprobados = False
                relacionados = False
            #Comprueba que todos los artefactos esten aprobados
            for art in artefactos:
                if not art.estado == 'A':
                    aprobados = False
                    noaprobadoslist.append(art)
            #Comprueba que tenga relaciones con la fase anterior
            #for art in artefactos:
                if not hasRelWithPre(art):
                    if not hasRelWithPreThr(art):
                        relacionados = False
                        norelacionadoslist.append(art)
            faseanterior = Artefacto.objects.filter(proyecto=proyecto, fase='A', historico='A')
            for artfa in faseanterior:
                relaciones = Relacion.objects.filter(padre__historico='A', hijo=artfa, between=True)
                if not relaciones:
                    seguimiento = False
                    noseguimientolist.append(artfa)
            if aprobados and relacionados and seguimiento:
                LineaBase.objects.create(proyecto=proyecto, fase=proyecto.fase_actual)
                linbase = LineaBase.objects.get(proyecto=proyecto, fase=proyecto.fase_actual)
                for art in artefactos:
                    art.estado = 'B'
                    art.lineaBase = linbase
                    art.save()
                proyecto.fase_actual = 'I'
                proyecto.save()
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'existe': existe,
            'noaprobadoslist': noaprobadoslist,
            'aprobados': aprobados,
            'relacionados': relacionados,
            'norelacionadoslist': norelacionadoslist,
            'seguimiento':seguimiento,
            'noseguimientolist':noseguimientolist,
            'proyecto':proyecto,
            'tipoadr': 'artdi_read'
        })
        return render_to_response('gen_linbased.html', variables)
    variables = RequestContext(request)
    return render_to_response('gen_linbased.html', variables)

def hasRelWithPre(artefacto):
    """
    Funcion que obtiene las relaciones directas de un artefacto con los artefactos de la fase
    anterior.
    :param artefacto: Artefacto que desea conocer sus relaciones directas.
    :return: Retorna True si posee por lo menos una relacion directa.
    """
    padre = Relacion.objects.filter(padre=artefacto, between=True)
    if padre:
        return True
    else:
        return False
        
def hasRelWithPreThr(artefacto):
    """
    Funcion que obtiene las relaciones indirectas de un artefacto con los artefactos de la fase
    anterior.
    :param artefacto: Artefacto que desea conocer sus relaciones indirectas.
    :return: Retorna True si posee por lo menos una relacion indirecta.
    """
    hasrel = False
    padres = Relacion.objects.filter(hijo=artefacto, between=False)
    if padres:
        for padre in padres:
            if hasRelWithPre(padre.padre):
                hasrel = True
            elif hasRelWithPreThr(padre.padre):
                hasrel = True
        return hasrel
    else:
        return False
#///////////////////////////////
#Retorna el queryset con todos los artefactos que se veran afectados(hacia delante)
def impacto_pro_an(request):
    """
    Vista que muestra el impacto de un artefacto de la fase de analisis hacia adelante, es decir, 
    con sus hijos y con los artefactos de fases posteriores..
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=18)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        artefacto = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = artefacto.proyecto.nombre
        artefactos = impactoFwd(artefacto).distinct().order_by('fase')
        impacto = 0
        for art in artefactos:
            impacto = impacto + art.complejidad
        variables = RequestContext(request, {
            'artefacto':artefacto,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoadr': 'artan_read',
            'impacto': impacto
        })
        return render_to_response('artefacto/impacto_pro_an.html', variables)
    variables = RequestContext(request)
    return render_to_response('artefacto/impacto_pro_an.html', variables)
    
def impacto_pro_di(request):
    """
    Vista que muestra el impacto de un artefacto de la fase de disenyo hacia adelante, es decir, 
    con sus hijos y con los artefactos de fases posteriores.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=22)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        artefacto = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = artefacto.proyecto.nombre
        artefactos = impactoFwd(artefacto).distinct().order_by('fase')
        impacto = 0
        for art in artefactos:
            impacto = impacto + art.complejidad
        variables = RequestContext(request, {
            'artefacto':artefacto,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoadr': 'artdi_read',
            'impacto': impacto
        })
        return render_to_response('artefacto/impacto_pro_di.html', variables)
    variables = RequestContext(request)
    return render_to_response('artefacto/impacto_pro_di.html', variables)

def impacto_pro_im(request):
    """
    Vista que muestra el impacto de un artefacto de la fase de implementacion hacia adelante, es decir, 
    con sus hijos y con los artefactos de fases posteriores.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=26)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        artefacto = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = artefacto.proyecto.nombre
        artefactos = impactoFwd(artefacto).distinct().order_by('fase')
        impacto = 0
        for art in artefactos:
            impacto = impacto + art.complejidad
        variables = RequestContext(request, {
            'artefacto':artefacto,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoadr': 'artim_read',
            'impacto': impacto
        })
        return render_to_response('artefacto/impacto_pro_im.html', variables)
    variables = RequestContext(request)
    return render_to_response('artefacto/impacto_pro_im.html', variables)    
    
def impacto_reg_an(request):
    """
    Vista que muestra el impacto de un artefacto de la fase de analisis hacia atras, es decir, 
    con los artefactos de fases anteriores.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=18)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        artefacto = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = artefacto.proyecto.nombre
        artefactos = impactoBck(artefacto).distinct().order_by('fase')
        impacto = 0
        for art in artefactos:
            impacto = impacto + art.complejidad
        variables = RequestContext(request, {
            'artefacto':artefacto,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoadr': 'artan_read',
            'impacto': impacto
        })
        return render_to_response('artefacto/impacto_reg_an.html', variables)
    variables = RequestContext(request)
    return render_to_response('artefacto/impacto_reg_an.html', variables)
    
def impacto_reg_di(request):
    """
    Vista que muestra el impacto de un artefacto de la fase de disenyo hacia atras, es decir, 
    con los artefactos de fases anteriores.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=22)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        artefacto = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = artefacto.proyecto.nombre
        artefactos = impactoBck(artefacto).distinct().order_by('fase')
        impacto = 0
        for art in artefactos:
            impacto = impacto + art.complejidad
        variables = RequestContext(request, {
            'artefacto':artefacto,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoadr': 'artdi_read',
            'impacto': impacto
        })
        return render_to_response('artefacto/impacto_reg_di.html', variables)
    variables = RequestContext(request)
    return render_to_response('artefacto/impacto_reg_di.html', variables)
    
def impacto_reg_im(request):
    """
    Vista que muestra el impacto de un artefacto de la fase de implementacion hacia atras, es decir, 
    con los artefactos de fases anteriores.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=26)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        artefacto = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = artefacto.proyecto.nombre
        artefactos = impactoBck(artefacto).distinct().order_by('fase')
        impacto = 0
        for art in artefactos:
            impacto = impacto + art.complejidad
        variables = RequestContext(request, {
            'artefacto':artefacto,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoadr': 'artim_read',
            'impacto': impacto
        })
        return render_to_response('artefacto/impacto_reg_im.html', variables)
    variables = RequestContext(request)
    return render_to_response('artefacto/impacto_reg_im.html', variables)

def impactoFwd(artefacto):
    """
    Funcion que calcula el impacto de un artefacto hacia adelante, es decir, con todos sus hijos y los
    artefactos de fases posteriores y los hijos de estos.
    :param artefacto: Artefacto que desea conocer su impacto.
    :return: Retorna el inpacto sobre todos los artefactos con los que esta relacionado. 
    """
    proyecto = artefacto.proyecto
    yomismo = Artefacto.objects.filter(id=artefacto.id)
    arthijos = Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(id__in=Relacion.objects.filter(padre=artefacto).filter(between=False).filter(hijo__historico='A').values_list('hijo', flat=True))
    #arthijos = Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(id__in=Relacion.objects.values_list('hijo', flat=True))
    #return arthijos
    artfwd = Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(id__in=Relacion.objects.filter(hijo=artefacto).filter(between=True).filter(padre__historico='A').values_list('padre', flat=True))
    fwd = arthijos|artfwd
    #if not Fwd:
    #    return yomismo.distinct()
    arts = yomismo
    #//////////////////////////////
    for art in fwd.distinct():
        desc = impactoFwd(art)
        if desc:
            arts = arts|yomismo|arthijos|artfwd|desc
            #arts=arts|desc
        else:
            arts = arts|yomismo|arthijos|artfwd
    return arts

#Retorna el queryset con todos los artefactos que se veran afectados(hacia atras)
def impactoBck(artefacto):
    """
    Funcion que calcula el impacto de un artefacto hacia atras, es decir, con todos los
    artefactos de fases anteriores y los hijos de estos.
    :param artefacto: Artefacto que desea conocer su impacto.
    :return: Retorna el inpacto sobre todos los artefactos con los que esta relacionado.
    """
    proyecto = artefacto.proyecto
    yomismo = Artefacto.objects.filter(id=artefacto.id)
    artpadre = Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(id__in=Relacion.objects.filter(hijo=artefacto).filter(between=False).filter(padre__historico='A').values_list('padre', flat=True))
    artbck = Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(id__in=Relacion.objects.filter(padre=artefacto).filter(between=True).filter(hijo__historico='A').values_list('hijo', flat=True))
    bck = artpadre|artbck
    #if not Bck:
    #    return yomismo.distinct()
    arts = yomismo
    for art in bck.distinct():
        ancs = impactoBck(art)
        if ancs:
            arts = arts|yomismo|artpadre|artbck|ancs
        else:
            arts = arts|yomismo|artpadre|artbck
    return arts
        
#Muestra el historial completo de un artefacto
@login_required	
def ver_historial_an(request):
    """
    Vista que despliega una lista de artefactos de la fase de analisis existentes en el proyecto, 
    muestra el historial con todas las versiones del artefacto seleccionado, muestra una descripcion 
    de la version seleccionada y habilita la opcion de restaurar la version seleccionada. 
    """
    restaurar = False
    if 'idVer' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idVer'])
        artactual = Artefacto.objects.get(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto, historico='A')
        proyname = art.proyecto.nombre
        user = Usuario.objects.get(username=request.user.username)
        project = Proyecto.objects.get(nombre=proyname)
        us_rol_pro = UsRolPro.objects.filter(usuario=user).filter(proyecto=project)
        for us_rol in us_rol_pro:
                perms=us_rol.rol.rol_permiso.all()
                for perm in perms:
                    if perm.id == 20:
                        restaurar = True
        tipoart = art.tipoArtefacto
        artefactos = Artefacto.objects.filter(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto).order_by('version')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'restaurar': restaurar,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoart': tipoart,
            'tipoadr': 'historial_an',
            'artefacto': art,
            'artActual': artactual,
        })
        return render_to_response('read_historial_an.html', variables)   
    elif 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = art.proyecto.nombre
        tipoart = art.tipoArtefacto
        artefactos = Artefacto.objects.filter(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto).order_by('-version')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'restaurar': restaurar,
            'show_his_list': True,
            'artefactos': artefactos,
            'retorna': 'artan_read',
            'proyname': proyname,
            'tipoart': tipoart,
            'tipoadr': 'historial_an',
            'artefacto': art
        })
        return render_to_response('read_historial_an.html', variables) 
    variables = RequestContext(request)
    return render_to_response('read_historial_an.html', variables)

@login_required	
def ver_historial_di(request):
    """
    Vista que despliega una lista de artefactos de la fase de disenyo existentes en el proyecto, 
    muestra el historial con todas las versiones del artefacto seleccionado, muestra una descripcion 
    de la version seleccionada y habilita la opcion de restaurar la version seleccionada. 
    """
    if 'idVer' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idVer'])
        artactual = Artefacto.objects.get(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto, historico='A')
        proyname = art.proyecto.nombre
        user = Usuario.objects.get(username=request.user.username)
        project = Proyecto.objects.get(nombre=proyname)
        us_rol_pro = UsRolPro.objects.filter(usuario=user).filter(proyecto=project)
        for us_rol in us_rol_pro:
                perms=us_rol.rol.rol_permiso.all()
                for perm in perms:
                    if perm.id == 24:
                        ltipoart = True
                        tipoarttag = True
                        desarrollotag = True
        tipoart = art.tipoArtefacto
        artefactos = Artefacto.objects.filter(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto).order_by('version')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoart': tipoart,
            'tipoadr': 'historial_di',
            'artefacto': art,
            'artActual': artactual,
        })
        return render_to_response('read_historial_di.html', variables)   
    elif 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = art.proyecto.nombre
        tipoart = art.tipoArtefacto
        artefactos = Artefacto.objects.filter(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto).order_by('-version')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'show_his_list': True,
            'artefactos': artefactos,
            'retorna': 'artdi_read',
            'proyname': proyname,
            'tipoart': tipoart,
            'tipoadr': 'historial_di',
            'artefacto': art
        })
        return render_to_response('read_historial_di.html', variables) 
    variables = RequestContext(request)
    return render_to_response('read_historial_di.html', variables)

@login_required	
def ver_historial_im(request):
    """
    Vista que despliega una lista de artefactos de la fase de implementacion existentes en el proyecto, 
    muestra el historial con todas las versiones del artefacto seleccionado, muestra una descripcion 
    de la version seleccionada y habilita la opcion de restaurar la version seleccionada. 
    """
    restaurar = False
    if 'idVer' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idVer'])
        artactual = Artefacto.objects.get(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto, historico='A')
        proyname = art.proyecto.nombre
        user = Usuario.objects.get(username=request.user.username)
        project = Proyecto.objects.get(nombre=proyname)
        us_rol_pro = UsRolPro.objects.filter(usuario=user).filter(proyecto=project)
        for us_rol in us_rol_pro:
                perms=us_rol.rol.rol_permiso.all()
                for perm in perms:
                    if perm.id == 28:
                        restaurar = True
        tipoart = art.tipoArtefacto
        artefactos = Artefacto.objects.filter(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto).order_by('version')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'artefactos': artefactos,
            'proyname': proyname,
            'tipoart': tipoart,
            'tipoadr': 'historial_im',
            'artefacto': art,
            'artActual': artactual,
        })
        return render_to_response('read_historial_im.html', variables)   
    elif 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        proyname = art.proyecto.nombre
        tipoart = art.tipoArtefacto
        artefactos = Artefacto.objects.filter(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto).order_by('-version')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'show_his_list': True,
            'artefactos': artefactos,
            'retorna': 'artim_read',
            'proyname': proyname,
            'tipoart': tipoart,
            'tipoadr': 'historial_im',
            'artefacto': art
        })
        return render_to_response('read_historial_im.html', variables) 
    variables = RequestContext(request)
    return render_to_response('read_historial_im.html', variables)
    
@login_required	
def apro_artim(request):
    """
    Funcion que aprueba los artefactos de la fase de implamentacion.
    """
    #if request.method == 'POST':
    #    artefacto=Artefacto.objects.get(id=request.POST['idArt'])
    #    return HttpResponseRedirect('/proyecto/success')
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=37)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        artefact = Artefacto.objects.get(id=request.GET['idArt'])
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'aprobar_im',
            'artefact': artefact
        })
        return render_to_response('aprobar_artim.html', variables)   
    elif 'proyectoname' in request.GET:
        try:
            if 'idApro' in request.GET:
                art = Artefacto.objects.get(id=request.GET['idApro'])
                if art.fase == 'I':
                    art.estado = 'A'
                    art.save()
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').filter(historico='A').exclude(estado='A').order_by('tipoArtefacto', 'nro_Artefacto')
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'show_art_list': True,
            'artefactos': artefactos,
            'proyname':proyname,
            'tipoadr': 'aprobar_im'
        })
        return render_to_response('aprobar_artim.html', variables)
    variables = RequestContext(request)
    return render_to_response('aprobar_artdi.html', variables)

@login_required	
def leer_artefactoim(request):
    """
    Vista que despliega una lista que contiene todos los artefactos de la fase de implementacion
    existentes dentro de un proyecto, se mostrara la descripcion del artefacto seleccionado. 
    """
    #if request.method == 'POST':
    #    artefacto=Artefacto.objects.get(id=request.POST['idArt'])
    #    return HttpResponseRedirect('/proyecto/success')
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    #perm = Permiso.objects.get(id=26)
    #if not usuario.has_perm(perm):
    #    return HttpResponseRedirect('/restringido')
    if 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        #art_edit_form = ArtefactoAnForm({'nombre': art.nombre, 'descr_breve': art.descripcionBreve, 'descr_detallada':art.descripcionDetallada})
        proyname = art.proyecto.nombre
        padre = ''
        for rel in Relacion.objects.filter(padre__historico='A').filter(hijo=art, between=False) :
            padre = rel.padre
        artrelhijo = Artefacto.objects.filter(id__in=Relacion.objects.filter(padre=art, between=False).values_list('hijo', flat=True))
        artrelpar = Artefacto.objects.filter(id__in=Relacion.objects.filter(padre=art, between=True).values_list('hijo', flat=True))
        artrelpar = artrelpar|Artefacto.objects.filter(id__in=Relacion.objects.filter(hijo=art, between=True).values_list('padre', flat=True))
        #artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='A').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname': proyname,
            'artRelHijo': artrelhijo,
            'artRelPar': artrelpar.order_by('fase'),
            'padre': padre,
            #'artefactos': artefactos,
            'tipoadr': 'artim_read',
            'artefacto': art
        })
        return render_to_response('read_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        try:
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'show_art_list': True,
            'proyname': proyname,
            'artefactos': artefactos,
            'tipoadr': 'artim_read'
        })
        return render_to_response('read_artefacto.html', variables)
    variables = RequestContext(request)
    return render_to_response('read_artefacto.html', variables)

@login_required
def crearArtefactoIm(request):
    """
    Vista que despliega los campos para introducir los datos de un nuevo artefacto de la fase de
    implementacion, dentro de un proyecto.
    """
    proyId = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=27)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        artefactoform = ArtefactoImForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=artefactoform.data['idproy'])
        proyname = proyecto.nombre
        if artefactoform.is_valid():
            arts_tipo = Artefacto.objects.filter(proyecto=proyecto, tipoArtefacto=artefactoform.cleaned_data['tipoArtefacto']).order_by('nro_Artefacto')
            numero = 1
            if arts_tipo:
                for art in arts_tipo:
                    numero = art.nro_Artefacto+1
            archivo = artefactoform.cleaned_data['adjunto']
            artefacto = Artefacto.objects.get_or_create(nombre=artefactoform.cleaned_data['nombre'],
                        descripcionBreve= artefactoform.cleaned_data['descr_breve'],
                        descripcionDetallada= artefactoform.cleaned_data['descr_detallada'],
                        tipoArtefacto=artefactoform.cleaned_data['tipoArtefacto'],
                        proyecto=proyecto,
                        nro_Artefacto=numero,
                        version=1,
                        complejidad=artefactoform.cleaned_data['complejidad'],
                        fase= 'I', adjunto=artefactoform.cleaned_data['adjunto'],
                        user_creado=Usuario.objects.get(username=request.user.username),
                        estado='I',
                        historico='A', fecha=datetime.now())
            artefacto = Artefacto.objects.get(nombre=artefactoform.cleaned_data['nombre'], proyecto=proyecto)
            if archivo:
                artefacto.adjunto = Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size)
                artefacto.save()
            for art in artefactoform.cleaned_data['relacionhijo']:
                Relacion.objects.create(padre=artefacto, hijo=art)
            for art in artefactoform.cleaned_data['relacionpar']:
                Relacion.objects.create(padre=artefacto, hijo=art, between=True)
            #return HttpResponseRedirect('/proyecto/success/')
            if 'idArt' in request.GET:
                art = Artefacto.objects.get(id=request.GET['idArt'])
                proyname = art.proyecto.nombre
                variables = RequestContext(request, {
                    'show_tipo_list': False,
                    'proyname': proyname,
                    'tipoadr': 'artim_read',
                    'artefacto': art
                })
                return render_to_response('read_artefacto.html', variables)   
            elif 'proyectoname' in request.GET:
        
                try:
            
                    proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                    proyname = proyecto.nombre
                    #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
                    artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
                except:
                    raise Http404(u'Request not found.')
                variables = RequestContext(request, {
                    'show_art_list': True,
                    'proyname': proyname,
                    'artefactos': artefactos,
                    'tipoadr': 'artdi_read'
                })
                return render_to_response('read_artefacto.html', variables)
            variables = RequestContext(request)
            return render_to_response('read_artefacto.html', variables)
        else:
            artefactoform.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True), required=False)
            artefactoform.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D').exclude(id__in=Relacion.objects.exclude(padre__historico='A').values_list('hijo', flat=True)),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
            artefactoform.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D'),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
    elif 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyId = proyecto.id
        proyname = proyecto.nombre
        artefactoform = ArtefactoImForm(initial={'idproy':proyId})
        artefactoform.fields['tipoArtefacto'] = forms.ModelChoiceField(queryset=TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True).filter(fase='I'), required=False)
        #relacionhijoform= RelacionHijo()
        #filtra los artefactos que ya tienen padres
        artefactoform.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='I').exclude(id__in=Relacion.objects.filter(padre__historico='A').values_list('hijo', flat=True)),
                                        #queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        artefactoform.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D'),
                                        #queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='A').exclude(id__in=Relacion.objects.exclude(padre=art).values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        variables = RequestContext(request, {
            'artefactoform': artefactoform,
            'idProy':proyId,
            'proyname':proyname
        })
        return render_to_response('artefacto_save.html', variables)
    variables = RequestContext(request, {
        'artefactoform': artefactoform,
        'idProy':proyId,
        'proyname':proyname
    })
    return render_to_response('artefacto_save.html', variables)

@login_required
def editar_artefactoim(request):
    """
    Vista que despliega los campos para modificar los datos de un artefacto de la fase de 
    implementacion, que existe dentro de un proyecto. 
    """
    show_art_list = False
    idProy = ''
    artefactos = ''
    proyname = ''
    art_edit_form = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=28)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        art_edit_form = ArtefactoImEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        idProy = proyecto.id
        artef = Artefacto.objects.get(id=request.POST['idart'])
        proyname = proyecto.nombre
        if art_edit_form.is_valid():
            artef = Artefacto.objects.get(id=art_edit_form.data['idart'])
            tipoArt = TipoArtefacto.objects.get(nombre=art_edit_form.cleaned_data['tipoArtefacto'], proyec_tipoar=proyecto)
            numero = artef.nro_Artefacto
            try:
                adjedit = art_edit_form.cleaned_data['adjunto']
                artefacto = Artefacto.objects.get(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            tipoArtefacto=tipoArt,
                            nro_Artefacto=numero,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            historico='A',
                            )
                if artefacto.descripcionDetallada == art_edit_form.cleaned_data['descr_detallada']:
                    if adjedit:
                        if artefacto.adjunto:
                            if not artefacto.adjunto.nombre == adjedit.name and artefacto.adjunto.contenido == base64.b64encode(adjedit.read()):
                                Artefacto.objects.get(id=0)
                        else:
                            Artefacto.objects.get(id=0)
                    for art in art_edit_form.cleaned_data['relacionhijo']:
                        if not art.id in Relacion.objects.filter(padre=artefacto).filter(between=False).values_list('padre', flat=True):
                            Artefacto.objects.get(id=0)
                    for idart in Relacion.objects.filter(padre=artefacto).filter(between=False).values_list('padre', flat=True):
                        if not Artefacto.objects.get(id=idart) in art_edit_form.cleaned_data['relacionhijo']:
                            Artefacto.objects.get(id=0)
                    for art in art_edit_form.cleaned_data['relacionpar']:
                        if not art.id in Relacion.objects.filter(padre=artefacto).filter(between=True).values_list('padre', flat=True):
                            Artefacto.objects.get(id=0)
                    for idart in Relacion.objects.filter(padre=artefacto).filter(between=True).values_list('padre', flat=True):
                        if not Artefacto.objects.get(id=idart) in art_edit_form.cleaned_data['relacionpar']:
                            Artefacto.objects.get(id=0)
                    return HttpResponseRedirect('/artim_edit/?proyectoname=%s' %  proyecto.nombre)
                else:
                    Artefacto.objects.get(id=0)
            except Artefacto.DoesNotExist:
                artef.historico = 'H'
                artef.save()
                archivo=art_edit_form.cleaned_data['adjunto']
                artefacto = Artefacto.objects.create(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            descripcionDetallada= art_edit_form.cleaned_data['descr_detallada'],
                            tipoArtefacto=tipoArt,
                            proyecto=proyecto,
                            nro_Artefacto=numero,
                            version=artef.version + 1,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            fase= 'I', adjunto=art_edit_form.cleaned_data['adjunto'],
                            user_creado=Usuario.objects.get(username=request.user.username),
                            estado='M',
                            historico='A',
                            fecha=datetime.now()
                            )
                artefacto = Artefacto.objects.get(nombre=art_edit_form.cleaned_data['nombre'],
                            descripcionBreve= art_edit_form.cleaned_data['descr_breve'],
                            tipoArtefacto=tipoArt,
                            nro_Artefacto=numero,
                            complejidad=art_edit_form.cleaned_data['complejidad'],
                            historico='A',
                            )
                if archivo:
                    artefacto.adjunto = Archivo.objects.create(nombre=archivo.name, contenido=base64.b64encode(archivo.read()), tamano=archivo.size)
                    artefacto.save()
                else:
                    artefacto.adjunto = artef.adjunto
                    artefacto.save()
                for art in art_edit_form.cleaned_data['relacionhijo']:
                    Relacion.objects.create(padre=artefacto, hijo=art)
                for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
                    
                for art in art_edit_form.cleaned_data['relacionpar']:
                    Relacion.objects.create(padre=artefacto, hijo=art, between=True)
                #for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                #    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
            return HttpResponseRedirect('/artim_edit/?proyectoname=%s' %  proyecto.nombre)

        else:
            art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='I').exclude(id__in=Relacion.objects.exclude(padre=artef).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(artef).values_list('padre', flat=True)).exclude(id=artef.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
            art_edit_form.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D'),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
    elif 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        art = Artefacto.objects.get(id=request.GET['idArt'])
        art_edit_form = ArtefactoDiEditForm(initial={'idart':art.id,
                                                    'idproy':proyecto.id,
                                                    'nombre': art.nombre,
                                                    'descr_breve': art.descripcionBreve,
                                                    'descr_detallada':art.descripcionDetallada,
                                                    'complejidad':art.complejidad,
                                                    'adjunto':art.adjunto,
                                                    'tipoArtefacto':art.tipoArtefacto.get_nombre()})
        
        art_edit_form.fields['relacionhijo'] = forms.ModelMultipleChoiceField(label=u'Relaciones de hijos',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='I').exclude(id__in=Relacion.objects.exclude(padre=art).filter(padre__historico='A').values_list('hijo', flat=True)).exclude(id__in=ancestro(art).values_list('padre', flat=True)).exclude(id=art.id),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        art_edit_form.fields['relacionhijo'].initial=[rel.hijo.id for rel in Relacion.objects.filter(padre=art, between=False)]
        art_edit_form.fields['relacionpar'] = forms.ModelMultipleChoiceField(label=u'Relaciones con la fase anterior',
                                        queryset=Artefacto.objects.filter(proyecto=proyecto).filter(historico='A').filter(fase='D'),
                                        required=False,
                                        widget=forms.SelectMultiple(attrs={'size': 5}))
        art_edit_form.fields['relacionpar'].initial=[rel.hijo.pk for rel in Relacion.objects.filter(padre=art, between=True)]

       
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artim_edit',
            'art_edit_form': art_edit_form
        })
        return render_to_response('artefacto/edit_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        show_art_list = True
        try:
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            idProy = proyecto.id
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            
        except:
            raise Http404(u'Request not found.')
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
    variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artim_edit',
            'art_edit_form': art_edit_form
        })
    return render_to_response('artefacto/edit_artefacto.html', variables)
    

@login_required	
def eliminar_artefactoim(request):
    """
    Vista que despliega una lista que contiene todos los artefactos de la fase de implementacion
    dentro de un proyecto, se mostrara la descripcion del artefacto seleccionado y 
    podra ser eliminado. 
    """
    show_art_list = False
    idProy = ''
    artefactos = ''
    proyname = ''
    artefact = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=29)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #art_edit_form = ArtefactoAnEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        proyname = proyecto.nombre
        artef = Artefacto.objects.get(id=request.POST['idArt'])
        artef.historico = 'H'
        artef.save()
        Artefacto.objects.create(nombre=artef.nombre,
                            descripcionBreve= artef.descripcionBreve,
                            descripcionDetallada= artef.descripcionDetallada,
                            tipoArtefacto=artef.tipoArtefacto,
                            proyecto=artef.proyecto,
                            nro_Artefacto=artef.nro_Artefacto,
                            version=artef.version + 1,
                            complejidad=artef.complejidad,
                            fase= 'I',
                            adjunto=artef.adjunto,
                            user_creado=Usuario.objects.get(username=request.user.username),
                            estado='E',
                            historico='E',
                            fecha=datetime.now()
                            )
        #return HttpResponseRedirect('/proyecto/success/')
        if 'proyectoname' in request.GET:
            show_art_list = True
            try:
                proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
                proyname = proyecto.nombre
                idProy = proyecto.id
            except:
                raise Http404(u'Request not found.')
            artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artim_delete',
            'artefact': artefact
        })
        return render_to_response('artefacto/delete_artefacto.html', variables)
    elif 'idArt' in request.GET and 'proyectoname' in request.GET:
        proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        proyname = proyecto.nombre
        idProy = proyecto.id
        artefact = Artefacto.objects.get(id=request.GET['idArt'])
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artim_delete',
            'artefact': artefact
        })
        return render_to_response('artefacto/delete_artefacto.html', variables)   
    elif 'proyectoname' in request.GET:
        show_art_list = True
        try:
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            idProy = proyecto.id
        except:
            raise Http404(u'Request not found.')
        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='I').filter(historico='A').order_by('tipoArtefacto', 'nro_Artefacto')
    variables = RequestContext(request, {
            'show_art_list': show_art_list,
            'proyname':proyname,
            'idProy': idProy,
            'artefactos': artefactos,
            'tipoadr': 'artim_delete',
            'artefact': artefact
        })
    return render_to_response('artefacto/delete_artefacto.html', variables)
    
@login_required	
def gen_lineaba_im(request):
    """
    Funcion que verifica que todos los artefactos de la fase de implemantacion esten aprobados, que todos
    los artefactos tengan relacion con algun artefacto de la fase de disenyo y que todos los artefactos
    de la fase de disenyo tengan relacion con los artefactos de esta fase, una vez verificados estos 
    requerimientos se genera la linea base.
    """
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=34)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'proyectoname' in request.GET:
        aprobados = True
        relacionados = True
        existe = True
        seguimiento = True
        try:
            noaprobadoslist = []
            norelacionadoslist = []
            noseguimientolist = []
            #userlog = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            #artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='A')
            artefactos = Artefacto.objects.filter(proyecto=proyecto, fase='I', historico='A')
            if not artefactos:
                existe = False
                aprobados = False
                relacionados = False
            #Comprueba que todos los artefactos esten aprobados
            for art in artefactos:
                if not art.estado == 'A':
                    aprobados = False
                    noaprobadoslist.append(art)
            #Comprueba que tenga relaciones con la fase anterior
            #for art in artefactos:
                if not hasRelWithPre(art):
                    if not hasRelWithPreThr(art):
                        relacionados = False
                        norelacionadoslist.append(art)
            faseanterior = Artefacto.objects.filter(proyecto=proyecto, fase='D', historico='A')
            for artfa in faseanterior:
                relaciones = Relacion.objects.filter(padre__historico='A', hijo=artfa, between=True)
                if not relaciones:
                    seguimiento = False
                    noseguimientolist.append(artfa)
            if aprobados and relacionados:
                LineaBase.objects.create(proyecto=proyecto, fase=proyecto.fase_actual)
                linbase = LineaBase.objects.get(proyecto=proyecto, fase=proyecto.fase_actual)
                for art in artefactos:
                    art.estado = 'B'
                    art.lineaBase = linbase
                    art.save()
                proyecto.fase_actual = 'T'
                proyecto.save()
        except:
            raise Http404(u'Request not found.')
        variables = RequestContext(request, {
            'existe': existe,
            'noaprobadoslist': noaprobadoslist,
            'aprobados': aprobados,
            'relacionados': relacionados,
            'norelacionadoslist': norelacionadoslist,
            'seguimiento':seguimiento,
            'noseguimientolist':noseguimientolist,
            'proyecto':proyecto,
            'tipoadr': 'artim_read'
        })
        return render_to_response('gen_linbasei.html', variables)
    variables = RequestContext(request)
    return render_to_response('gen_linbasei.html', variables)
    
    
@login_required
def restaurar_an(request): 
    """
    Funcion que restaura la version seleccionada de un artefacto de la fase de analisis, con todas sus relaciones. 
    """
    idProy = ''
    proyname = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=24)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #art_edit_form = ArtefactoDiEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        proyname = proyecto.nombre
        if True:
            artef = Artefacto.objects.get(id=request.POST['idArt'])
            #tipoArt = TipoArtefacto.objects.get(nombre=art_edit_form.cleaned_data['tipoArtefacto'], proyec_tipoar=proyecto)
            numero = artef.nro_Artefacto
            #except Artefacto.DoesNotExist:
            artef.historico = 'H'
            artef.save()
            verAnt = Artefacto.objects.get(id=request.POST['idVer'])
            artefacto = Artefacto.objects.create(nombre=verAnt.nombre,
                        descripcionBreve= verAnt.descripcionBreve,
                        descripcionDetallada= verAnt.descripcionDetallada,
                        tipoArtefacto= verAnt.tipoArtefacto,
                        proyecto=proyecto,
                        nro_Artefacto = numero,
                        version=artef.version + 1,
                        complejidad= verAnt.complejidad,
                        fase= verAnt.fase, adjunto=verAnt.adjunto,
                        user_creado=Usuario.objects.get(username=request.user.username),
                        estado='M',
                        historico='A',
                        fecha=datetime.now()
                        )
            artefacto = Artefacto.objects.get(nombre=verAnt.nombre,
                        descripcionBreve= verAnt.descripcionBreve,
                        tipoArtefacto= verAnt.tipoArtefacto,
                        nro_Artefacto=numero,
                        complejidad=verAnt.complejidad,
                        historico='A',
                        )
            for rel in Relacion.objects.filter(padre=verAnt).filter(between=False):
                try:
                    relac = Artefacto.objects.get(tipoArtefacto=rel.hijo.tipoArtefacto, nro_Artefacto=rel.hijo.nro_Artefacto, historico='A')
                    Relacion.objects.create(padre=artefacto, hijo=relac)
                except Artefacto.DoesNotExist:
                    bandera = 1
               
            for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                Relacion.objects.create(padre=rel.padre, hijo=artefacto)
                    
            for rel in Relacion.objects.filter(padre=verAnt).filter(between=True):
                try:
                    relac = Artefacto.objects.get(tipoArtefacto=rel.hijo.tipoArtefacto, nro_Artefacto=rel.hijo.nro_Artefacto, historico='A')
                    Relacion.objects.create(padre=artefacto, hijo=relac, between=True)
                except Artefacto.DoesNotExist:
                    bandera = 1
                #Relacion.objects.create(padre=artefacto, hijo=art, between=True)
            #for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
            #    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
            if verAnt.fase == 'A':
                return HttpResponseRedirect('/artan_read?proyectoname=%s' % proyecto.nombre)
            elif verAnt.fase == 'D':
                return HttpResponseRedirect('/artdi_read?proyectoname=%s' % proyecto.nombre)
            elif verAnt.fase == 'I':
                return HttpResponseRedirect('/artim_read?proyectoname=%s' % proyecto.nombre)
    elif 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        #idArtActual=Artefacto.objects.get(id=request.GET['idVer'])
        artActual = Artefacto.objects.get(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto, historico='A')
        idArtActual = artActual.id
        proyecto = art.proyecto
        proyname = proyecto.nombre
        idProy = proyecto.id
#        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'proyname':proyname,
            'idProy': idProy,
            'artefact': art,
            'idArtActual': idArtActual
        })
        return render_to_response('restaurar_an.html', variables)   
    variables = RequestContext(request, {
            'proyname':proyname,
            'idProy': idProy,
        })
    return render_to_response('restaurar_an.html', variables)

@login_required
def restaurar_di(request): 
    """
    Funcion que restaura la version seleccionada de un artefacto de la fase de disenyo, con todas sus relaciones. 
    """
    idProy = ''
    proyname = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=24)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #art_edit_form = ArtefactoDiEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        proyname = proyecto.nombre
        if True:
            artef = Artefacto.objects.get(id=request.POST['idArt'])
            #tipoArt = TipoArtefacto.objects.get(nombre=art_edit_form.cleaned_data['tipoArtefacto'], proyec_tipoar=proyecto)
            numero = artef.nro_Artefacto
            #except Artefacto.DoesNotExist:
            artef.historico = 'H'
            artef.save()
            verAnt = Artefacto.objects.get(id=request.POST['idVer'])
            artefacto = Artefacto.objects.create(nombre=verAnt.nombre,
                        descripcionBreve= verAnt.descripcionBreve,
                        descripcionDetallada= verAnt.descripcionDetallada,
                        tipoArtefacto= verAnt.tipoArtefacto,
                        proyecto=proyecto,
                        nro_Artefacto = numero,
                        version=artef.version + 1,
                        complejidad= verAnt.complejidad,
                        fase= verAnt.fase, adjunto=verAnt.adjunto,
                        user_creado=Usuario.objects.get(username=request.user.username),
                        estado='M',
                        historico='A',
                        fecha=datetime.now()
                        )
            artefacto = Artefacto.objects.get(nombre=verAnt.nombre,
                        descripcionBreve= verAnt.descripcionBreve,
                        tipoArtefacto= verAnt.tipoArtefacto,
                        nro_Artefacto=numero,
                        complejidad=verAnt.complejidad,
                        historico='A',
                        )
            for rel in Relacion.objects.filter(padre=verAnt).filter(between=False):
                try:
                    relac = Artefacto.objects.get(tipoArtefacto=rel.hijo.tipoArtefacto, nro_Artefacto=rel.hijo.nro_Artefacto, historico='A')
                    Relacion.objects.create(padre=artefacto, hijo=relac)
                except Artefacto.DoesNotExist:
                    bandera = 1
               
            for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                Relacion.objects.create(padre=rel.padre, hijo=artefacto)
                    
            for rel in Relacion.objects.filter(padre=verAnt).filter(between=True):
                try:
                    relac = Artefacto.objects.get(tipoArtefacto=rel.hijo.tipoArtefacto, nro_Artefacto=rel.hijo.nro_Artefacto, historico='A')
                    Relacion.objects.create(padre=artefacto, hijo=relac, between=True)
                except Artefacto.DoesNotExist:
                    bandera = 1
                #Relacion.objects.create(padre=artefacto, hijo=art, between=True)
            #for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
            #    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
            if verAnt.fase == 'A':
                return HttpResponseRedirect('/artan_read?proyectoname=%s' % proyecto.nombre)
            elif verAnt.fase == 'D':
                return HttpResponseRedirect('/artdi_read?proyectoname=%s' % proyecto.nombre)
            elif verAnt.fase == 'I':
                return HttpResponseRedirect('/artim_read?proyectoname=%s' % proyecto.nombre)
    elif 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        #idArtActual=Artefacto.objects.get(id=request.GET['idVer'])
        artActual = Artefacto.objects.get(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto, historico='A')
        idArtActual = artActual.id
        proyecto = art.proyecto
        proyname = proyecto.nombre
        idProy = proyecto.id
#        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'proyname':proyname,
            'idProy': idProy,
            'artefact': art,
            'idArtActual': idArtActual
        })
        return render_to_response('restaurar_di.html', variables)   
    variables = RequestContext(request, {
            'proyname':proyname,
            'idProy': idProy,
        })
    return render_to_response('restaurar_di.html', variables)

@login_required
def restaurar_im(request): 
    """
    Funcion que restaura la version seleccionada de un artefacto de la fase de implementacion,
    con todas sus relaciones. 
    """
    idProy = ''
    proyname = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=24)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        #art_edit_form = ArtefactoDiEditForm(request.POST, request.FILES)
        proyecto = Proyecto.objects.get(id=request.POST['idProy'])
        proyname = proyecto.nombre
        if True:
            artef = Artefacto.objects.get(id=request.POST['idArt'])
            #tipoArt = TipoArtefacto.objects.get(nombre=art_edit_form.cleaned_data['tipoArtefacto'], proyec_tipoar=proyecto)
            numero = artef.nro_Artefacto
            #except Artefacto.DoesNotExist:
            artef.historico = 'H'
            artef.save()
            verAnt = Artefacto.objects.get(id=request.POST['idVer'])
            artefacto = Artefacto.objects.create(nombre=verAnt.nombre,
                        descripcionBreve= verAnt.descripcionBreve,
                        descripcionDetallada= verAnt.descripcionDetallada,
                        tipoArtefacto= verAnt.tipoArtefacto,
                        proyecto=proyecto,
                        nro_Artefacto = numero,
                        version=artef.version + 1,
                        complejidad= verAnt.complejidad,
                        fase= verAnt.fase, adjunto=verAnt.adjunto,
                        user_creado=Usuario.objects.get(username=request.user.username),
                        estado='M',
                        historico='A',
                        fecha=datetime.now()
                        )
            artefacto = Artefacto.objects.get(nombre=verAnt.nombre,
                        descripcionBreve= verAnt.descripcionBreve,
                        tipoArtefacto= verAnt.tipoArtefacto,
                        nro_Artefacto=numero,
                        complejidad=verAnt.complejidad,
                        historico='A',
                        )
            for rel in Relacion.objects.filter(padre=verAnt).filter(between=False):
                try:
                    relac = Artefacto.objects.get(tipoArtefacto=rel.hijo.tipoArtefacto, nro_Artefacto=rel.hijo.nro_Artefacto, historico='A')
                    Relacion.objects.create(padre=artefacto, hijo=relac)
                except Artefacto.DoesNotExist:
                    bandera = 1
               
            for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
                Relacion.objects.create(padre=rel.padre, hijo=artefacto)
                    
            for rel in Relacion.objects.filter(padre=verAnt).filter(between=True):
                try:
                    relac = Artefacto.objects.get(tipoArtefacto=rel.hijo.tipoArtefacto, nro_Artefacto=rel.hijo.nro_Artefacto, historico='A')
                    Relacion.objects.create(padre=artefacto, hijo=relac, between=True)
                except Artefacto.DoesNotExist:
                    bandera = 1
                #Relacion.objects.create(padre=artefacto, hijo=art, between=True)
            #for rel in Relacion.objects.filter(hijo=artef).filter(padre__historico='A'):
            #    Relacion.objects.create(padre=rel.padre, hijo=artefacto)
            if verAnt.fase == 'A':
                return HttpResponseRedirect('/artan_read?proyectoname=%s' % proyecto.nombre)
            elif verAnt.fase == 'D':
                return HttpResponseRedirect('/artdi_read?proyectoname=%s' % proyecto.nombre)
            elif verAnt.fase == 'I':
                return HttpResponseRedirect('/artim_read?proyectoname=%s' % proyecto.nombre)
    elif 'idArt' in request.GET:
        art = Artefacto.objects.get(id=request.GET['idArt'])
        #idArtActual=Artefacto.objects.get(id=request.GET['idVer'])
        artActual = Artefacto.objects.get(tipoArtefacto=art.tipoArtefacto, nro_Artefacto=art.nro_Artefacto, historico='A')
        idArtActual = artActual.id
        proyecto = art.proyecto
        proyname = proyecto.nombre
        idProy = proyecto.id
#        artefactos = Artefacto.objects.filter(proyecto=proyecto).filter(fase='D').order_by('tipoArtefacto', 'nro_Artefacto')
        variables = RequestContext(request, {
            'proyname':proyname,
            'idProy': idProy,
            'artefact': art,
            'idArtActual': idArtActual
        })
        return render_to_response('restaurar.html', variables)   
    variables = RequestContext(request, {
            'proyname':proyname,
            'idProy': idProy,
        })
    return render_to_response('restaurar.html', variables)
    
@login_required
def crearTipoArtefactoGral(request):
    """
    Vista que despliega los campos para introducir los datos de un nuevo tipo de artefacto, dentro del sistema.
    Esta vista esta habilitada para el administrador del sistema.
    """
    proyId = 0
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=39)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        tipoform = TipoArtGralForm(request.POST, request.FILES)
        if tipoform.is_valid():
            tipoArt = TipoArtefacto.objects.get_or_create(nombre=tipoform.cleaned_data['nombre'],
                    #icono=tipoform.cleaned_data['icono'],
                    codigo=tipoform.cleaned_data['codigo'],
                    fase=tipoform.cleaned_data['fase'],
                    is_active=True)
            return HttpResponseRedirect('/tipoartgral_read/')
    else:
        tipoform = TipoArtGralForm()
    variables = RequestContext(request, {
        'tipoform': tipoform,
    })
    return render_to_response('tipoartefacto/tipoartgral_save.html', variables)

@login_required	
def editar_tipoartgral(request):
    """
    Vista que despliega los campos para modificar los datos de un tipo de artefacto existente dentro
    del sistema. Esta vista estara habilitada para el administrador del sistema.
    """
    show_tipo_list = False
    tiposArt = ''
    tipoform = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=40)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        tipoform = TipoArtGralEditForm(request.POST, request.FILES)
        if tipoform.is_valid():
            tipoArt = TipoArtefacto.objects.get(id=tipoform.cleaned_data['idtipo'])
            tipoArt.nombre = tipoform.cleaned_data['nombre']
            #tipoArt.icono = tipoform.cleaned_data['icono']
            tipoArt.codigo = tipoform.cleaned_data['codigo']
            tipoArt.fase = tipoform.cleaned_data['fase']
            tipoArt.save()
            return HttpResponseRedirect('/tipoartgral_edit/')
    elif 'tiponame' in request.GET:
        tipoArt = TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=None)
        tipoform = TipoArtGralEditForm(initial={'idtipo':tipoArt.id, 'nombre': tipoArt.nombre, 'codigo':tipoArt.codigo, 'fase':tipoArt.fase})#, 'icono': tipoArt.icono})
        idTipo = tipoArt.id
        tiposArt = TipoArtefacto.objects.all()
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'tiposArt': tiposArt,
            'idTipo': idTipo,
            'tipoadr': 'tipoartgral_edit',
            'tipo_edit_form': tipoform
        })
        return render_to_response('tipoartefacto/editar_tipoartgral.html', variables)
    else:
        show_tipo_list = True
        tipoform = TipoArtGralEditForm()
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=None).filter(is_active=True)
    variables = RequestContext(request, {
        'show_tipo_list': show_tipo_list,
        'tiposArt': tiposArt,
		'tipoadr': 'tipoartgral_edit',
        'tipo_edit_form': tipoform
    })
    return render_to_response('tipoartefacto/editar_tipoartgral.html', variables)	

@login_required	
def leer_tipoartgral(request):
    """
    Vista que despliega una lista que contiene todos los tipos de artefacto existentes dentro del
    sistema, se mostrara la descripcion del tipo de artefacto seleccionado. Esta vista estara 
    habilitada para el administrador del sistema.
    """
    show_tipo_list = False
    proyname = ''
    tiposArt = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=38)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if 'tiponame' in request.GET:
        tipoArt = TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=None)
        tiposArt = TipoArtefacto.objects.all()
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'tiposArt': tiposArt,
            'tipoadr': 'tipoartgral_read',
            'tipoArt': tipoArt,
            'proyname':proyname,
        })
        return render_to_response('tipoartefacto/leer_tipoartgral.html', variables)
    else:
        show_tipo_list = True
        #proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
        #proyname = proyecto.nombre
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=None).filter(is_active=True)
    variables = RequestContext(request, {
        'show_tipo_list': show_tipo_list,
        'tiposArt': tiposArt,
        'tipoadr': 'tipoartgral_read',
        'proyname':proyname,
    })
    return render_to_response('tipoartefacto/leer_tipoartgral.html', variables)

@login_required	
def eliminar_tipoartgral(request):
    """
    Vista que despliega una lista que contiene todos los tipos de artefacto dentro del sistema, se mostrara la
    descripcion del tipo de artefacto seleccionado y podra ser eliminado. Esta vista estara habilitada para 
    el administrador del sistema.
    """
    show_tipo_list = False
    proyname = ''
    tiposArt = ''
    usuario = Usuario.objects.get(username=request.user.username)#obtiene el usuario logueado actualmente
    perm = Permiso.objects.get(id=41)
    if not usuario.has_perm(perm):
        return HttpResponseRedirect('/restringido')
    if request.method == 'POST':
        tipoart = TipoArtefacto.objects.get(id=request.POST['idtipo'])
        #tipoart.is_active = False
        #tipoart.save()
        tipoart.delete()
        return HttpResponseRedirect('/tipoartgral_delete/')
        if 'proyectoname' in request.GET:
            show_tipo_list = True
            proyecto = Proyecto.objects.get(nombre=request.GET['proyectoname'])
            proyname = proyecto.nombre
            tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=proyecto).filter(is_active=True)
        variables = RequestContext(request, {
            'show_tipo_list': show_tipo_list,
            'tiposArt': tiposArt,
            'tipoadr': 'tipoartgral_delete',
        })
        return render_to_response('tipoartefacto/eliminar_tipoartgral.html', variables)
    elif 'tiponame' in request.GET:
        tipoArt = TipoArtefacto.objects.get(nombre=request.GET['tiponame'], proyec_tipoar=None)
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=None).filter(is_active=True)
        variables = RequestContext(request, {
            'show_tipo_list': False,
            'tiposArt': tiposArt,
            'tipoadr': 'tipoartgral_delete',
            'tipoArt': tipoArt,
        })
        return render_to_response('tipoartefacto/eliminar_tipoartgral.html', variables)
    else:
        show_tipo_list = True
        tiposArt = TipoArtefacto.objects.filter(proyec_tipoar=None).filter(is_active=True)
    variables = RequestContext(request, {
        'show_tipo_list': show_tipo_list,
        'tiposArt': tiposArt,
        'tipoadr': 'tipoartgral_delete',
    })
    return render_to_response('tipoartefacto/eliminar_tipoartgral.html', variables)
	
